在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;
}
为什么尽可能少的回报?早期的回报并不是邪恶的(好吧,除非你需要清理) – Vlad
每个函数一个return语句的概念可以追溯到结构化编程的概念。这个概念是关于一个例程退出。参见:http://en.wikipedia.org/wiki/Structured_programming –
@jsobo:自石器时代结束以后,这个概念是不是已经过时了? – Vlad