【问题标题】:comma vs && operator in loops and if-else循环和 if-else 中的逗号与 && 运算符
【发布时间】:2014-06-16 10:05:08
【问题描述】:

考虑代码:

if(x = a/b, a%b) 
 printf("do this");
else 
 printf("do that");

现在,如果我将 if 语句替换为 if(x = a/b && a % b)。然后它也有效。所以我想知道用&& 运算符替换逗号,反之亦然,在if-else and loops 中是否总是有效

【问题讨论】:

    标签: c comma-operator


    【解决方案1】:

    如果你用 && 替换逗号操作符,你会稍微改变逻辑。逗号操作符的作用是执行 x = a/b 并“丢弃结果”,即不考虑 if 的条件,只考虑 a%b。

    如果你这样做

    if(x = a/b && a % b)
    

    当且仅当 a/b 非零且 a % b 非零时,才会打印“执行此操作”。而对于逗号运算符,只有当 a % b 不为零时才会打印“执行此操作”。

    【讨论】:

      【解决方案2】:

      它们完全不同!


      在第一个示例中,,comma operator,这是一个二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。

      所以,

      if(x = a/b, a%b) 
      

      相当于(感谢@jaket)

      x = a/b;
      if(a%b) 
      

      a%b 将始终被评估。


      第二个:

      if(x = a/b && a % b)
      

      等价于

      x = (a/b) && (a%b);
      if( x )
      

      a%b 只有在a/b(即a/b 不为零)为真时才会被评估。

      【讨论】:

      • 等价,除了 x 被赋值的副作用。
      • 好的,这个while(scanf("%d", &n), n)while(scanf("%d", &n) && n)怎么样;
      • @ashish2expert 他们将为这种情况生成相同的结果。但是我不建议你写这样的代码。考虑可读性。
      • 这就是我困惑的原因。
      • @herohuyongtao 更正错误,如果使用逗号运算符,则两者都在 in 中进行评估,并且仅当第一个为真时才评估运算符最后一个。
      【解决方案3】:

      && 运算符在确定表达式x = a/b && a%b 时强制考虑a/b 的结果,如果是,,则忽略a/b 的结果。所以用&& 替换, 并不总是有效。而不是正确的做法,

      【讨论】:

        【解决方案4】:
        if(x = a/b, a%b)
        

        是一种模糊的、不可读的书写方式

        x = a/b;
        if(a%b)
        

        但是

        x = a/b && a % b
        

        等价于

        x = ( (a/b) && (a%b) );
        

        总而言之,不要在同一行中混合使用大量不同的运算符。 唯一你用它实现的事情就是在创造错误的同时迷惑自己。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 2012-10-09
          • 2019-08-11
          • 2016-06-26
          • 2021-09-16
          • 2021-02-27
          • 2013-12-02
          相关资源
          最近更新 更多