-1

これを自分でチェックするのに便利なコンパイラがありません。

  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 ...
4

3 に答える 3

3

!=は左から右に関連付けられているため:

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

に翻訳することができます

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

しかし、結果は期待したものではありません。たとえば、与えられたa = 100, b = 200;の場合a != bは です0。これは、真の値は として評価され1、偽の値は として評価されるため0です。だからあなたの質問に:

バージョン 1 (下記) のコードは C C99 で有効ですか? コンパイルして実行できますか?バージョン 2 のコードと論理的に同等ですか?

これは有効ですが、バージョン 2 のコードと同等ではありません。

于 2013-08-07T01:13:59.060 に答える
2

最初のプログラムは有効な C コードです。

!=演算子の結果が0またはであるため、2 番目のプログラムと同等ではありません1

于 2013-08-07T01:06:42.237 に答える
1

4 つの変数の値がすべて異なるかどうかを確認する場合は、2 番目のバージョンが正しいです。論理演算子の左右結合のため、最初のバージョンは次のように解析されます。

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

dそのため、ゼロまたは 1 のいずれかの値に等しいかどうかを確認することになります。

于 2013-08-07T01:14:08.200 に答える