Home > OS >  Shorthand for return function
Shorthand for return function

Time:10-02

The code below demonstrate in C language so anyone could easily understand the need. But I use to know many other programming language as well.

Running the code as [1] will give me an error in some programming language & some programming language give warning

[1]:
int get_value(int number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return 21; }

  // return;
}

So, I must code something like [2] to clear the error/warning

[2]:
int get_value(int number) {
  int ret = 0;

  if (number == 0) { ret = 12; }
  else if (number == 1) { ret = 21; }

  return ret;
}

QUESTION:

How do I shorthanded the code in [2] as the code in [1] without any error/warning. And the expected code as short as [1]

CodePudding user response:

imagine that the parameter number = 3

then what would you return ?

you can simply write at the end of the function return 0;

so:

int get_value(int number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return = 21; }

  return 0;
}

so you should think of different values of the parameter called number.

CodePudding user response:

In the first code snippet compilers issue a message because the function returns nothing if number is not equal to 0 or 1.

You could write for example

int get_value(int number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return 21; }
  else { return 0; }
}

Or you could write

int get_value(int number) {
  int ret[] = { 12, 21 };

  if ( 0 <= number && number <= 1 ) { return ret[number]; }
  else { return 0; }
}

Or you could use the conditional operator like for example

int get_value(int number) {
  return number == 0 ? 12 : number == 1 ? 21 : 0;
}

CodePudding user response:

By universal convention (including in C), 0 is regarded as false and all other values are true.

So it may make sense to code:

int get_value(int number) {
    if (number == 0) {
        return 12; 
    }
     return 21;
}

As others point out you don't appear to have defined a return value for all possible inputs. It maybe that your function is only ever called with 0 or 1. If that's the case the parameter name number is poorly chosen.

But "defensive programming" says you should deal with all cases.

You either map all inputs into legitimate return values or introduce an error handler or trap.

Here's an error trap version using the assert() macro.

#include <assert.h>

int get_value(int number) {
    assert((number==0)||(number==1));
    if (number == 0) {
        return 12; 
    }
    
    return 21;
}

If the condition provided to the assert() macro is false, execution ends printing a diagnostic message.

CodePudding user response:

These warnings/errors arise because your function declaration states that it should always return an int:

int get_value(int number) {

In the first version of your code, it would not do that for numbers other than 0 or 1:

int get_value(int number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return 21; }
}

For example, what would this do if you called it with number set to 2?

The second example always returns an int, thus honouring the "contract" defined by the function declaration:

int get_value(int number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return 21; }
  return 0;
}

In some (non-C) programming languages -- such as Ruby or Javascript -- the former would be allowed due to nil/None/undefined being used as an implicit return value, but this is because function declarations do not specify that they "must" return an int value in those languages:

// Javascript example:
function get_value(number) {
  if (number == 0) { return 12; }
  else if (number == 1) { return 21; }
}

get_value(2) // Returns `undefined`.

CodePudding user response:

How do I shorthanded the code..??
You can study the problem, and use branchless programming to give you the results that you want.

#include <stdio.h>

int get_value( unsigned int n ) {
    return (n<2)*(0x2AC>>(5*n))&0x1F;
}

int main() {
    for( int i = 0; i < 10; i   )
        printf( "%i:  -  -\n", i, get_value( i ), (i<2)*(0x2AC>>(5*i))&0x1F );

    return 0;
}
0:  12  12
1:  21  21
2:   0   0
3:   0   0
4:   0   0
5:   0   0
6:   0   0
7:   0   0
8:   0   0
9:   0   0
  • Related