2012-02-09 56 views
1

這個int c = (a==b)正是我想在我的C程序中說的,用GCC編譯的。我可以做到,顯然(它工作得很好),但我不知道它是否會導致未定義的行爲。我的程序不會與其他編譯器或其他體系結構一起編譯。這是合法的ANSI C嗎?謝謝。對作業右側的評估

+4

有什麼不明確的地方呢? o_O – kennytm 2012-02-09 20:11:08

+0

什麼編譯器不接受它? – cnicutar 2012-02-09 20:11:54

+0

所以,你的意思是答案是「是的,這是合法的」?你爲什麼會用另一個問題回答一個問題? – 2012-02-09 20:12:16

回答

4

這是完全合法的。如果a等於b,然後c將是1否則,這將是0。

+0

如果'a'等於'b',那麼'c'可以是任何非零的東西,對吧? – 2012-02-09 20:15:39

+3

@Teh:不,它必須是1.(C99§6.5.9/ 3是這樣說的) – kennytm 2012-02-09 20:16:51

+0

我不確定,但我認爲它必須是1.(任何非零數字的意思是正確的,但比較運算符只返回0或1)編輯:我看到KennyTM的評論之前寫了這個。 – asaelr 2012-02-09 20:18:08

1
int c = (a == b); 

這是完全合法的。初始化是C標準(C99§6.7.8)的一部分,右側可以是任何賦值表達式,包括a == b(當然,假設ab被定義並且具有可比類型)。

+0

謝謝。正是我需要的答案。 – 2012-02-09 20:14:42

0

那麼,這取決於ab是什麼類型。如果他們是支持平等檢查的類型,那麼是的,這是完全合法的。

1

如果在塊範圍聲明c,這是完全有效的。

在文件範圍聲明時,它是無效的,因爲初始化器必須是常量表達式。

a == b是一個表達式,在這個意義上說與另一個表達式a + ba & b沒有什麼不同。