2010-07-18 65 views
0

我可以在C++中聲明兩個變量嗎?編譯器給了一個錯誤,但還是我想我應該得到一個意見:在條件聲明兩個變量?

int main() 
{ 
    double d1 = 0; 
    if((double d2 = d1) || (double d3 = 10)) 
     cout << "wow" << endl; 
    return 0; 
} 
+0

不,那當然是無效的。你到底想做什麼? – 2010-07-18 19:06:34

+0

這是不正確的,即使它被允許,它總是會評估爲真。 – DumbCoder 2010-07-18 19:17:09

回答

5

你只能做到這一點對一個變量

if(double d2 = d1) 
    cout << "wow" << endl; 
else 
if(double d3 = 10) 
    cout << "wow" << endl; 

,但我會宣佈他們的條件之外。如果你害怕有關的範圍,你總是可以限制它:

{ 
    double d2 = d1; 
    double d3 = 10; 
    if(d2 || d3) 
    cout << "wow" << endl; 
} 

當然,這個評估即使d2計算結果爲true第二初始化。但我認爲這並不重要。

0

這是不可能在C++中,也許你正在考慮的C#或較新的編程語言。在條件之外聲明d2和d3沒有任何缺點。

0

您可能想問問C++標準文檔在哪裏。

我不認爲這是一個好主意,你正在嘗試做的是告訴編譯器:

聲明D2在D2 放D1比D2 0 如果是= 0跳!下面 其他 聲明D3代碼 把10 D3 比較D2 0 如果它是!= 0跳轉到下面 其他 代碼跳過下面

代碼只是聲明D2和D3的康迪以上只有當你使用有限的內存(並且不希望在達到這段代碼之前爲d2和d3分配空間),這可能是一個好主意。這一切歸結爲你真正打算做的事情。

0

在C++中,你可以做這樣的事情:

if (bool b = (a == b)) { 
    // Do something with b here... 
} 

或:

if (double d2 = d1) { 
    // ... 
} 

但是,我從來沒有見過這種風格在真正的代碼中使用。我認爲總是有更清晰的方式來寫同一件事。

此外,試圖聲明ifwhile語句的條件部分中的多個變量不受支持。您將不得不求助於嵌套ifelse if以獲得相同的語義。

實施例:

if (double d2 = d1) { 
    cout << "wow" << endl; 
} else if (double d3 = 10) { 
    cout << "wow" << endl; 
} 

這樣d3如果d2評估爲假僅創建。

3
if((double d2 = d1) || (double d3 = 10)) 
    cout << d2 + d3 << endl; 

||操作者短路,所以d2 + d3表達式引用(潛在地)未初始化D3。這樣的功能會產生很多不良影響,IMO也無濟於事,所以這可能就是爲什麼它不在那裏。

+1

_uninitialized_變量在C++中沒有問題(只需鍵入'double d3;',你將會有一個)。我猜,問題出在_undeclared_變量中。例如,'double d3;如果(double d2 = d1 || d3 = 10)'會讓你的答案的第一句話(觀察)仍然是正確的,但是讓你的結論(你的答案的第二句)不正確。 – Jasper 2010-07-18 19:42:13

+1

@Jasper,條件工作將等於允許跳過初始化變量,這同樣是不允許的。請注意'double d3;'是允許的,但'string s3;'永遠不會讓字符串「未初始化」 - 它會調用它的默認構造函數。但是,你期望一個可以轉換爲「布爾」的字符串在這樣的條件下做什麼?它會被它的構造函數初始化嗎? – 2010-07-18 19:48:58

+1

@Johannes,我完全意識到,你正在「未定義行爲」的魔法世界中結束,在這個世界中,任何事情都可能發生,因此你仍然不應該使用我給的樣本,我只是試圖找出問題的原因更好。如果字符串是空的,我希望一個可轉換爲「bool」的字符串轉換爲false(儘管我會在字符串的文檔中查看它),但爲了查看我期望的''''情況,我需要一個你正在談論的情況的實例。 – Jasper 2010-07-18 19:55:41

1

可能還有其他的東西也困擾着你,但是||-operator的工作方式存在問題。我不記得它是如何在標準的措辭,但在a || b或者你的編譯器應該不評估b如果a評估爲真,或者您的編譯器可能會選擇不這樣做。

考慮到在你的語句中你不能確定你的變量是否已經聲明 - 在C++中你只能使用聲明的變量,所以d3在你的例子中將是一個非常無用的變量,如果你問我你不確定它是否已被聲明)。

+0

它被宣佈無論如何。聲明發生在編譯區,它們不是在運行時確定的。你可以跳過初始化,但它會一直聲明。 – GManNickG 2010-07-19 03:57:35

+1

錯了。聲明確實是在編譯時完成的。但是,由於代碼將它放到運行時條件中,無論它是否需要聲明或者不是,這是沒有意義的東西,所以它會產生錯誤而不是編譯成功。所以,基本上,是的,你不能在運行時有一個聲明,這是你在這裏試圖做的,所以它吐出一個錯誤... – Jasper 2010-07-19 23:50:39