2012-09-11 21 views
1

getFieldSignExtended(int,int,int),我有if-else陈述在if-else陈述。我有int结果作为此函数的全局变量。根据程序控制流程的不同,我希望此功能返回result2有没有更好的方式返回c中的值比有多个返回语句?

起初我在这个函数的底部有一个返回语句,那是行不通的,我发现C的范围不像Java。因此我在该函数的底部添加了,并且我在if-else块中有8 return result2个语句。

有没有更好的方法来组织这个功能?我不想嵌套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; 
} 
+0

为什么尽可能少的回报?早期的回报并不是邪恶的(好吧,除非你需要清理) – Vlad

+2

每个函数一个return语句的概念可以追溯到结构化编程的概念。这个概念是关于一个例程退出。参见:http://en.wikipedia.org/wiki/Structured_programming –

+0

@jsobo:自石器时代结束以后,这个概念是不是已经过时了? – Vlad

回答

0

对不起,太多的阅读,我没有做任何事情在c年龄,但你可以创建一个小函数,互换lo和hi,并设置你喜欢更大的价值和更低的LO, 然后你不会需要这么多块基本上是做同样的事情

+0

我最终没有完全按照你的建议交换hi和lo,而是再次调用getFieldSignExtended(),并以hi和lo交替递归。现在一切正常。 – Clara

1

您不需要多个return语句,而不是您的函数在此刻工作。只需在函数结束时初始化result21并执行return result2;。或者,而不是分配到result2,然后直接返回,为什么不只是做例如return value;return maskMinus | result;

2

resultresult2不是“函数的全局变量”,它们是局部变量。问题不在于“C中的作用域与Java不同”,而是函数中的某些分支未能分配result2。具体来说,就是在做

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

如果声明的变量,而不在Java中的值分支不分配,编译器,代码路径,使用这个变量赋值之前,并提醒您,如果有一个;在C中,你必须亲自观察这些情况。

如果你把return result2底部,并确保所有代码路径分配result2正确的价值,你的代码将与单return声明的工作,就像你setField一样。

+1

如果您可能使用未初始化的变量,任何体面的C编译器也会给您一个警告。 – Shahbaz

+0

@Shahbaz这是真的,但在Java中,这是一个错误,而不是一个警告。 – dasblinkenlight

1

一般的答案是预留一个变量来存储您的返回值(例如,ret_val)并将您的返回值分配给您当前为return值的地方。您也许需要调整您的控制流程,因为现在您不在这些地方退出您的功能。

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

return ret_val; 

一旦应该有足够的上述变化。

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

0

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

+0

当然,goto语句通常是不被接受的,特别是在学术用途上。 – Mike

+0

goto是一个很大的禁忌! – Eregrith

+0

@Eregrith这不是一个无条件的“不 - no”,但在作业的背景下,它当然是:我还没有遇到一个教授,他会在他的学生作业中看到八个“goto”,并且什么也没说:) – dasblinkenlight

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 

所以你真正需要做的是结合了& 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语句。

0

试试这个:

int getFieldSignExtended (int value, int hi, int lo) { 
    if (hi < lo) { 
    // the field is on the 'far right' 
    hi = lo - hi; 
    lo = 0; 
    } 

    return (value << (31 - hi)) >> (31 - hi + lo); 
} 

请注意,给人一种特殊意义的情况下,“喜<罗的约定是价值令人怀疑。在这种情况下返回零可能更有意义。

相关问题