有没有比使用多个return语句更好的方法来返回c中的值?

时间:2012-09-11 12:01:02

标签: c

getFieldSignExtended(int,int,int)中,if-else语句中有if-else个语句。我有int结果作为此函数的全局变量。根据程序控制的流程,我希望此函数返回result2

起初我在这个函数的底部有一个return语句,但是没有用,我发现C中的范围与Java中的范围不同。因此,我return 1;位于函数的底部,我在return result2块中有8个if-else语句。

有没有更好的方法来组织这个功能?我不想嵌套if-else块,我希望尽可能少return个语句。

这是作业,但它已经评分,我只是纠正了一些错误。

getFieldSignExtended(int,int,int)得到一个从hi到lo的值的位域(hi和lo可以是==彼此等等)并且符号扩展它(基于测试符号位)。所有这些代码都涉及2的补码。

如果您发现任何其他重大的C常规错误,我将很乐意纠正它们。

提前致谢。

int getFieldSignExtended (int value, int hi, int lo) {
    unsigned int result = 0;
    int result2 = 0;
    unsigned int mask1 = 0xffffffff;
    int numberOfOnes = 0;

    if((hi == 31) && (lo == 0)) {
            result2 = value;
            return result2;
    }

    if((lo == 31) && (hi == 0)) {
            result2 = value;
            return result2;
    }
    else if(hi < lo) {
        // Compute size of mask (number of ones).
        numberOfOnes = lo-hi+1;
        mask1 = mask1 << (32-numberOfOnes);
        mask1 = mask1 >> (32-numberOfOnes);
        mask1 = mask1 << hi;
        result = value & mask1;
        result = result >> hi;
        if(result & (0x1 << (numberOfOnes-1))){
            // if negative
            int maskMinus = (0x1 << numberOfOnes);
            maskMinus = maskMinus -1;
            maskMinus = ~maskMinus;     
            result2 = maskMinus | result;
        }
    } else if(lo < hi) {
        // The number of ones are at the 'far right' side of a 32 bit number.
        numberOfOnes = hi-lo+1;
        mask1 = mask1 >> (32-numberOfOnes);
        mask1 = mask1 << lo;
        result = value & mask1;
        result = result >> lo;
        if(result & (0x1 << (numberOfOnes-1))){
            //if negative
            int maskMinus = (0x1 << numberOfOnes);
            maskMinus = maskMinus -1;
            maskMinus = ~maskMinus;     
            result2 = maskMinus | result;
            return result2;
        }
    }else{
        // hi == lo
        unsigned int mask2 = 0x1;

        // Move mask2 left.
        mask2 = mask2 << hi;
        result = mask2 & value;
        result = result >> hi;
        if(result == 0x1){
            result2 = 0xffffffff;
            return result2;
        }
        else{
            result2 = 0x0;
            return result2;
        }   
    }   

    return 1;
}

6 个答案:

答案 0 :(得分:2)

resultresult2不是“函数的全局变量”,它们是局部变量。问题不在于“C中的范围与Java不同”,而是函数中的某些分支无法分配result2。具体来说,分支中没有分配

printf(" result2 %08x \n",result2);

如果在Java中声明一个没有值的变量,编译器会在分配之前查找使用此变量的代码路径,并在有变量时提醒您;在C中你必须自己观察这些情况。

如果您将return result2放在底部,并确保所有代码路径都指定了result2正确的值,那么您的代码将使用单个return语句,就像您的{ {1}}确实。

答案 1 :(得分:1)

您不需要多个return语句,而不是因为您的功能目前正在运行。只需将result2初始化为1,然后在函数末尾执行return result2;

或者,不是分配给result2然后直接返回,为什么不这样做,例如return value;return maskMinus | result;等。

答案 2 :(得分:1)

一般答案是留出一个变量来存储您的返回值(例如ret_val),并在您当前return值的地方为其分配返回值。您可能还必须调整控制流,因为现在您没有使用这些位置的值退出函数。

然后,在您的函数的“底部”,您可以使用值ret_val返回一次。即,

 return ret_val;

一旦上述变化就足够了。

查看您的算法并重新安排代码,或许将某些工作委托给函数可能是另一种帮助简化/澄清代码的方法,从而无需多次(或过多的判断调用)返回。

答案 3 :(得分:0)

您可以使用goto语句,在单点处可以返回result2值。如果很好地解释here

答案 4 :(得分:0)

对不起太多的阅读,我在c中没有做任何事情,但是你可以创建小函数,交换lo和hi,并设置hi为更大的值和lo更低, 那么你就不需要那么多基本上做同样事情的块了

答案 5 :(得分:0)

只看getFieldSignExtended函数,我看到的问题非常简单。你现在只有2个地方可以返回...让我们简化一下,告诉你我的意思:

if (A)
  do something
if (B)
  do the same thing
else if (C)
  do something else
else if (D)
  do something else
else
  do something else 

所以你真正需要做的就是结合A&amp; B,通过这样做,你的函数中只有一个流,它不能下去“if”和“else if”,只有其中一个。所以,如果你这样做:

if(((hi == 31) && (lo == 0)) || ((lo == 31) && (hi == 0))){
    result2 = value;
}else if(hi < lo){  
...
// the rest as is

然后,您return result2;的每个地方都会删除该行,而最后只是return 1; return result2;

现在你只有一个这个函数的return语句。