2012-07-02 92 views
1

假設我有這樣一段代碼:在陣列中存儲的臨時值與多個變量

int foo(int a, int b, int c) 
{ 
    int tmp1, tmp2, tmp3; 
    ... 
    some_calculation0(&tmp1, a, b); // stores the result in tmp1 
    some_calculation1(&tmp2, b, c); 
    some_calculation2(&tmp3, tmp1, tmp2); 

    return tmp3; 
} 

最近我會寫爲:

int foo(int a, int b, int c) 
{ 
    int tmp[3]; 
    ... 
    some_calculation0(&tmp[0], a, b); // stores the result in tmp[0] 
    some_calculation1(&tmp[1], b, c); 
    some_calculation2(&tmp[2], tmp[0], tmp[1]); 

    return tmp[2]; 
} 

有什麼理由不做這樣的事情?有人會認爲這是不好的做法嗎?

在這種情況下,tmp值實際上是一串計算中的中間值,因爲所有函數都將其結果返回到通過引用傳遞的其中一個輸入變量中。對我來說,將它們組合在一起是有道理的,但是鑑於迄今爲止的迴應反對它,我沒有任何反對使用單獨的變量。

+0

你爲什麼要這樣做? – ouah

回答

4

這會干擾您的代碼的可讀性。變量名稱應該提供一些關於它們用法的信息。

雖然使用tmp作爲變量名有時是有用和合理的,但是以這種方式使用tmp數組並沒有提供如何使用變量的說明:您將計算的詳細信息隱藏在不透明的名稱/結構體。此外,我需要跟蹤指數來弄清代碼中發生了什麼,這很容易讓人感到困惑,並且容易出現程序員錯誤。

它不帶任何更多的精力去挑選特定的變量名,如果變量真的沒有更好的名字比tmpX,則寧願共同約定,例如,xyz迭代器,indexidx爲指數等..

0

這是非常主觀的,但我肯定會反對在第二個片段的風格。我認爲,除非你需要數組的特性(即連續存儲+數組指針衰減),否則你應該使所有變量標量並將其命名爲合理的,所以它不是tmp1,tmp2tmp3。我發現你的第二個片段很難打字,也很難閱讀(並且有更多的錯誤可能性)。

0

還有另一種變體:用於返回值是什麼它的目的是爲:

int foo(int a, int b, int c) 
{ 
    int part_a, part_b, result; 
    ... 
    part_a = some_calculation0(a, b); 
    part_b = some_calculation1(b, c); 
    result = some_calculation2(part_a, part_b); 

    return result; 
} 

而且,還有另一個,而神祕的版本可能(這種信任some_calculation [01]是功能;無副作用):

int foo(int a, int b, int c) 
{ 
    int result; 
    ... 

    result = some_calculation2(some_calculation0(a, b) 
           , some_calculation1(b, c)); 

    return result; 
} 

甚至:

int foo(int a, int b, int c) 
{ 
    ... 
    return some_calculation2(some_calculation0(a, b) 
          , some_calculation1(b, c)); 
} 

使用返回值有一個合乎邏輯的「性能」原因:在被調用函數的末尾,就在返回之前,編譯器將在寄存器中的某個位置準備好結果。在大多數情況下調用函數期望全部通用寄存器被子功能使用(及其內容被銷燬)。但不是返回值,在大多數體系結構中,作爲約定返回寄存器中的返回值(AX,或DX + AX在x86上)這對於調用者和被調用者來說是一個很好的便宜的rendez-vous點...

+0

我在OP中提到some_calculation函數全部返回它們的輸入結果。顯然,如果我可以改變他們的簽名,我可以做你的建議,但我不能。 – cdk

+0

在這種情況下,你已經接地了。標識符無關緊要,無論如何,一旦函數返回,對象將超出範圍。順便說一句:*爲什麼*是函數int,當它們不返回任何明智的東西時?多塵的甲板? BTW2:對不起:哎呀,我一定讀得太快了...... BTW3:好吧,至少我提出了一些很好的臨時名稱! – wildplasser