【问题标题】:What is a==b==c in C? [duplicate]什么是 C 中的 a==b==c? [复制]
【发布时间】:2021-07-31 15:34:50
【问题描述】:
int main()
{
    int a=0,b=0,c=0;

    if (a==b==c)
    {
         printf("111\n");
    }
    else
    {
         printf("222\n");
    }
    if (a==b)
    {
         printf("333");
    }
}

输出是

222
333

很明显,a==b==c 是False,a==b 是True。 但我找不到原因。 我想也许 a==b==c 是匹配变量的地址。 我需要更多的线索和证据。

【问题讨论】:

  • a == b == c(a == b) == c0 == c1 == c(如果ab 具有相同的值......是1 == c)。等式运算符== 产生一个int,其值为01
  • 这是关于运算符关联性。对于== 运算符,它从左到右导致@pmg 提到的情况。
  • 只是不要写a == b == c之类的代码。奇怪的代码给出了奇怪的结果。
  • 非常频繁的受骗。您应该使用上面的 SO 搜索框。

标签: c comparison operators


【解决方案1】:

相等运算符从左到右求值并产生1,如果 指定相等为真,0 如果为假。

因此 if 语句中的表达式

if (a==b==c)

等价于

if ( ( a == b ) == c )

由于 a 等于 b (两者都等于 0 ),那么第一个子表达式 ( a == b ) 的计算结果为 1,您实际上有

if ( 1 == c )

当 c 等于 0 时,表达式 1 == c 的计算结果为 0,并且 if 语句的复合语句被绕过。结果else语句的子语句被执行

printf("222\n");

也许代码作者的意思是下面的if语句

if ( ( a == b ) && ( b == c ) )

在这种情况下,a 等于 b 并且 b 等于 c,则此条件的计算结果为逻辑真。

另一方面,由于a 等于b,那么这个 if 语句也会被执行。

if (a==b)
{
     printf("333");
}

【讨论】:

    【解决方案2】:

    在 C 中,a == b == c 等价于 (a == b) == c,其中 a == b 如果为真则为 1,否则为 0。

    在您的情况下,a == b 为真,因此a == b == c 等价于1 == c,即为假。

    您可以进一步尝试:

    printf("%d\n%d\n", 0 == 0, 0 == 1);
    

    给出结果:

    1
    0
    

    【讨论】:

      【解决方案3】:

      比较运算符== 具有left to right 关联性。

      所以,像这样的表达式

       a == b == c
      

      一样
      (a == b ) == c
      

      在你的情况下,abc 都具有值0,表达式结果是

      (0 == 0) == 0
      

      或者,

        1 == 0
      

      产生 0(假)。因此,控制权转到else 部分。

      然后,由于上述原因,a == b 的计算结果为1(真实),因此相应的if 块被执行。

      【讨论】:

        猜你喜欢
        • 2015-02-01
        • 2015-11-20
        • 2014-03-26
        • 2014-12-21
        • 1970-01-01
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多