在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