2012-03-25 90 views
1

我預計b爲3.
這是一個未定義的行爲? 或結果可以預測?
但我認爲B。將3
和c是2 我得到的輸出爲1 2 1
請解釋在條件運算符中增加運算符c

#include<stdio.h> 
int main() 
{ 
int a = 0; 
int b = 1; 
int c = (a++ >b++)? a++ : b++; 
printf("%d %d %d",a,b,c); 
return 0; 
} 
+2

b是3,c是2 ..你用什麼編譯器? – Weston 2012-03-25 09:17:17

+0

pelles c.what是你的嗎? – cdummy 2012-03-25 09:25:38

+0

@Weston pelles c.i得到1 2 1作爲輸出。 – cdummy 2012-03-25 09:42:14

回答

4

那是我弄的,我同意它的保證是那。在進入第二個或第三個操作數之前評估第一個操作數(條件)後有一個序列點。因此,它是這樣的:

(a++ >b++) 

計算結果爲:

0 > 1 

是0

之後,a是1和b爲2

因爲它是假的:

b++ 

被評估。結果是2(分配給c),之後b是3.

如果這是確切的代碼,那麼您的編譯器就是錯誤的。這甚至不是一個秩序問題。即使第三個操作數在第一個操作數被評估之前(這將是錯誤的),b仍然應該是3.

我正在使用GCC 4.6.3,但結果在所有符合標準的編譯器中都是相同的。

+0

你有什麼輸出? – cdummy 2012-03-25 09:22:36

+0

@cdummy,1 3 2. – 2012-03-25 09:31:55

2

它是定義的行爲,第一個操作數?:與第二個或第三個操作數之間有一個序列點。

所以經過評估a++ < b++,a = 1和b = 2。然後第三個操作數被選中。因此c被分配b++。所以C = 2,然後 B = 3

的C11標準說:

6.5.15條件運算符

的第一個操作數進行評價;在它的 評估與評估第二或第三操作數 (以評估者爲準)之間有一個序列點。

+0

所以輸出是.. – cdummy 2012-03-25 09:21:58

+0

@cdummy Uhm 1 3 2 – cnicutar 2012-03-25 09:31:20

+0

我得到了1 2 1作爲輸出 – cdummy 2012-03-25 09:43:01