2011-01-07 100 views
1

sombody可以解釋這是如何工作的嗎?有人可以解釋這個C/C++語法嗎?

int x, y; 
.... 
(some_condition ? x : y) = 100; 

是這個意圖工作,或者僅僅是一個「盲」的翻譯或編譯器(類似vec[10]等於10[vec])?

回答

13

這是有效的C++和無效C.

條件表達式的結果可以是(在這種情況下是)的左值 C++指的取決於some_condition是否評估爲truex一個或y。在C++中任一x的值指定爲100,如果當轉換爲一個bool some_condition是true,否則y被分配100

在C,條件表達式的結果是不講左值並且不能被分配給。

0

根據情況分配給xy

4

至少在C++,該代碼段基本上是相同的:

if(some_condition) 
{ 
    x = 100; 
} 
else 
{ 
    y = 100; 
} 

它是由C++標準保證的,但你必須仔細閱讀相關章節。運算符的規則非常複雜(主要是由於執行了類型轉換),所以條件運算符和if-then-else語句並不總是完全相同。

然而,在你上面的代碼段,這一段的標準是相關的:

5.16/4條件運算符:

如果第二個和第三個操作數是左值和具有相同的類型,結果是這種類型,是一個左值。

+0

在我們的級別是,但是,我不確定從編譯器的角度。在x和y之間至少有一個強大的類型約束,它不存在於`if else`構造中。 – VGE 2011-01-07 07:56:08

0

它看起來像一個選擇左值的三元運算符。我不知道這可以做到,但我認爲這很有道理。根據條件,兩個值(x或y)中的一個將被分配數字100.

非常酷,如果它工作!

+0

我真的不確定它是否在每個現有的C++編譯器上工作!而三元運算符有點混淆,這個模式爲維護者增添了一點樂趣。 – VGE 2011-01-07 07:53:54

+0

@VGE:是的,它有點混亂。可能小到可以忍受(或享受?)。 – 2011-01-07 22:39:59

1

x和y都是相同類型的左值。 我不認爲這個代碼中有什麼東西是盲目的。 但是你可能會發現一些編譯器無法編譯這段代碼。

我通常更喜歡使用if/else代碼,它們會產生完全相同的代碼,並且對於維護者來說更具可讀性。 如果您想跟蹤bug,則將每個分支放在單獨的分支上更容易設置中斷點。

代碼覆蓋率控制也更容易檢查。

1

如果x和y是l值,則三元表達式是l值。

討論here

+0

僅限於C++。 (只有當他們的類型匹配?) – 2011-01-07 18:39:22

1

不,它是一個,如果條件下的短形式。這就像

if(somecondition) 
{ 
    x = 100; 
} 
else 
{ 
    y = 100; 
} 
0

它的目的是工作。

三元運算符?:如果它的兩個可能結果都是左值,就可以產生一個左值(即可以賦值的值),就像它們在你的例子中一樣。

因此,您的示例根據其他值將值分配給x或y。

2

它是具有相同的結果,因爲這代碼的表達式:

if (some_condition) 
    x = 100; 
else 
    y = 100; 
0

100被替換x或y的值取決於條件。它也通常用於返回 -

return condition ? x : y ; // If condition is true => return x else return y 
相關問題