2013-08-07 24 views
-1

我沒有一個方便的編譯器來自己檢查。C99單行比較語法快捷鍵

  1. 版本1(以下)中的代碼是否在C C99中有效?它會編譯並運行正常嗎?
  2. 它在邏輯上等同於版本2中的代碼嗎?

版本1:

int a, b, c, d; 

... some code to set the above variables ... 

if (a != b != c != d) 
    //Do something 

... rest of code ... 

版本2:

int a, b, c, d; 

... some code to set the above variables ... 

if ((a != b) && (a != c) && (a != d) && (b != c) && (b != d) && (c != d)) 
    //Do something 

... rest of code ... 
+3

如果您在線有幾個[在線編譯器](http://stackoverflow.com/questions/3916000/online-c-compiler-and-evaluator)可用,並至少與Coliru和ideone,它是直接前往使用C99。 –

回答

3

由於!=從左至右相關:

if (a != b != c != d) 

可以翻譯成

if (((a != b) != c) != d) 

但結果不是你所期望的,例如,給予a = 100, b = 200;,然後a != b0,因爲任何真值被評估爲1,假值爲0。因此,對於你的問題:

是否在C C99有效的版本1(下)中的代碼?它會編譯並運行正常嗎? 它在邏輯上等同於版本2中的代碼嗎?

它是有效的,但它並不等同於代碼版本2

2

第一程序是有效的C代碼。

它不等同於第二個程序,因爲!=運算符的結果是01

1

如果你正在試圖做的是檢查四個變量是否全部有不同的價值觀是什麼,然後第二個版本是正確的。因爲邏輯運算符的右左結合的,第一個版本將被解析爲:

if (((a != b) != c) != d) 

所以你最終檢查d是否等於某個值要麼是0或1。