两个'=='相同“if”中的相等运算符条件没有按预期工作

发布于 2024-08-19 15:48:28 字数 677 浏览 4 评论 0原文

我试图建立三个相等变量的相等性,但以下代码没有打印它应该打印的明显正确答案。有人可以解释一下,编译器如何在内部解析给定的 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))

I am trying to establish equality of three equal variables, but the following code is not printing the obvious correct answer which it should print. Can someone explain, how the compiler is parsing the given if(condition) internally?

#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;
}

Output:

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:~$

EDIT:

Going by the answers given below, is the following statement okay to check above equality?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

傻比既视感 2024-08-26 15:48:28
  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) )

... 因此是错误的答案;)

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

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

To avoid that:

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

Don't do this:

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

You'll get for i = 1, j = 2, k = 1 :

 if ( (false) == (false) )

... hence the wrong answer ;)

我的鱼塘能养鲲 2024-08-26 15:48:28

您需要将操作分开:

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

You need to separate the operations:

  if ( i == j && i == k)
肥爪爪 2024-08-26 15:48:28

表达式

i == j == k

被解析为

(i == j) == k

因此,您将 ij 进行比较并得到 true。然后将 true123 进行比较。 true 转换为整数,如 1。 1 不等于 123,因此表达式为 false。

您需要表达式 i == j && j == k

Expression

i == j == k

is parsed as

(i == j) == k

So you compare i to j and get true. Than you compare true to 123. true is converted to integer as 1. One is not equal 123, so the expression is false.

You need expression i == j && j == k

我爱人 2024-08-26 15:48:28

我会注意编译器的警告并将其写为 (i==j) && (j==k)。写起来需要更长的时间,但它意味着同样的事情,并且不太可能让编译器抱怨。

I'd heed the compiler's warning and write it as (i==j) && (j==k). It takes longer to write but it means the same thing and is not likely to make the compiler complain.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文