在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;
}
答案 0 :(得分:2)
result
和result2
不是“函数的全局变量”,它们是局部变量。问题不在于“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语句。