12

3つの等しい変数の同等性を確立しようとしていますが、次のコードは、出力する必要がある明らかな正解を出力していません。if(condition)誰かが、コンパイラが与えられたものを内部でどのように解析しているのか説明できますか?

#include<stdio.h>
int main()
{
        int i = 123, j = 123, k = 123;
        if ( i == j == k)
                printf("Equal\n");
        else
                printf("NOT Equal\n");
        return 0;
}

出力:

manav@workstation:~$ gcc -Wall -pedantic calc.c
calc.c: In function ‘main’:
calc.c:5: warning: suggest parentheses around comparison in operand of ‘==’
manav@workstation:~$ ./a.out
NOT Equal
manav@workstation:~$

編集:

以下の答えを見て、次のステートメントは上記の同等性をチェックしても大丈夫ですか?

if ( (i==j) == (j==k))
4

4 に答える 4

25
  if ( (i == j) == k )

  i == j -> true -> 1 
  1 != 123 

それを避けるために:

 if ( i == j && j == k ) {

これを行わないでください:

 if ( (i==j) == (j==k))

i = 1、j = 2、k = 1の場合:

 if ( (false) == (false) )

...したがって、間違った答え;)

于 2010-01-28T14:47:54.057 に答える
9

操作を分離する必要があります。

  if ( i == j && i == k)
于 2010-01-28T14:48:01.607 に答える
8

表現

i == j == k

として解析されます

(i == j) == k

したがって、と比較ijて取得しますtrue。あなたが比較trueするより123trueとして整数に変換され1ます。1つは等しくない123ため、式はfalseです。

表現が必要i == j && j == k

于 2010-01-28T14:53:09.567 に答える
7

コンパイラの警告に注意して、と書いて(i==j) && (j==k)ください。書くのに時間がかかりますが、それは同じことを意味し、コンパイラに文句を言わせることはないでしょう。

于 2010-01-28T14:48:10.873 に答える