我預計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;
}
我預計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;
}
那是我弄的,我同意它的保證是那。在進入第二個或第三個操作數之前評估第一個操作數(條件)後有一個序列點。因此,它是這樣的:
(a++ >b++)
計算結果爲:
0 > 1
是0
之後,a
是1和b
爲2
因爲它是假的:
b++
被評估。結果是2(分配給c
),之後b
是3.
如果這是確切的代碼,那麼您的編譯器就是錯誤的。這甚至不是一個秩序問題。即使第三個操作數在第一個操作數被評估之前(這將是錯誤的),b
仍然應該是3.
我正在使用GCC 4.6.3,但結果在所有符合標準的編譯器中都是相同的。
你有什麼輸出? – cdummy 2012-03-25 09:22:36
@cdummy,1 3 2. – 2012-03-25 09:31:55
它是定義的行爲,第一個操作數?:
與第二個或第三個操作數之間有一個序列點。
所以經過評估a++ < b++
,a = 1和b = 2。然後第三個操作數被選中。因此c被分配b++
。所以C = 2,然後 B = 3
的C11標準說:
6.5.15條件運算符
的第一個操作數進行評價;在它的 評估與評估第二或第三操作數 (以評估者爲準)之間有一個序列點。
b是3,c是2 ..你用什麼編譯器? – Weston 2012-03-25 09:17:17
pelles c.what是你的嗎? – cdummy 2012-03-25 09:25:38
@Weston pelles c.i得到1 2 1作爲輸出。 – cdummy 2012-03-25 09:42:14