2012-11-24 20 views
3

出於效率原因(雖然非常小),我想聲明並在if條件塊內分配一個變量。爲什麼我不能把聲明和邏輯運算符放在一起?

I.e.而不是說

if(a != 0 && a->b >= 10){ 
    int c = a->b 
    ... 
} 

我想在第一個地方這樣做,我得到的編譯錯誤的分配INT C和說

if(a != 0 && (int c = a->b) >= 10){ 
    ... 
} 

在其最直接的方式(對我來說)。有沒有人知道是否/不可能在C++中做到這一點?

+9

「不成熟的優化是萬惡之源」 - Donald Knuth。 –

+1

我很困惑..你用'a->'和'a.'訪問b哪一個? –

+0

您不能在C++編譯器期望布爾語句的地方進行分配。 –

回答

1

爲什麼你認爲這會優化任何東西?

即使假設你可以在條件內聲明和初始化一個變量(這在C++中是不可能的,因爲編譯器需要可以評估的東西並且聲明不會返回任何東西),每次都會這樣做評估條件(除非你縮短它,這是你的代碼段中的情況),但無論如何不會有任何改變:無論你在哪裏,你仍然在聲明和初始化一個變量。

+1

問題的關鍵在於,當條件爲真時,會立即再次評估「a-> b」。如果'a-> b'是一個昂貴的操作,那麼只評估一次就可能有意義。 – GSerg

+1

我仍然沒有看到優化中的任何一點:在'if'之前將'a-> b'分配給一個臨時的,然後在案例中使用它與他希望被允許使用的優化一樣昂貴。 – Jack

+1

@GSerg:好的,在這種情況下,你會有兩個嵌套的if,其中第一個嵌套'int c = a-> b'。 –

4
if(a != 0) { 
    int c = a->b; 

    if (c >= 10) { 
     //using c here 
    } 

    // common cleanup here 
} 
+0

酷GSerg,這是不會工作,這正是我通過的過程,並希望跳過嵌套IF案件因爲我需要重複一塊代碼爲兩個結果ELSE情況並且不是美麗的。 – negin

+0

@nino你不能將這段代碼移到內部'if'之外,以便它總是在外部'if'中執行? – GSerg

+0

我不這麼認爲,因爲如果內部IF持有,那段代碼就不會被調用。 – negin

0

它會工作,如果你有它在第一個條件。然而,相比之前在這種情況下,分配和你不會得到你想要的

int a = 3; 
int x = 0; 
if (bool b = a > 5 && x < 2) { 
printf("%d",b); 
} 
+0

嗯,順序對我很重要因爲我第一次檢查對象是否存在以便調用它的函數。 – negin

0
int c = (a == 0 ? 0 : a->b); 
if(a != 0 && c >= 10){ 

    ... 
} 

如果你想避免使用a->b多次。

+0

感謝Patrik的建議,這個想法很有效,但有一個缺點,就是將變量c定義在一個比所需範圍更大的範圍內。 – negin

相關問題