2012-09-11 25 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); 
} 

請注意,給人一種特殊意義的情況下,「喜<羅的約定是價值令人懷疑。在這種情況下返回零可能更有意義。

相關問題