c - 如何理解背靠背运营商的行为?

标签 c logical-operators operator-precedence

虽然这是基本问题,但我对使用 AND 和 OR 感到困惑。我了解在使用 AND 和 OR 逻辑运算符时存在短路方法。

Assume int a,x=0,y=0;
a). a= 10 && ++x && y++ 

Values a=0,x =1,y=1 [expected ]


 b). a= 10 && ++x || y++
 Values a=1 ,x=1,y=0 [short circuit 
  ,expected ]

 c). a= 10 || ++x || y++
 Values a=1 , x=0, y=0 [short 
  circuit ]

我的问题是:

  1. a = 10 && y++

    Values a =0, x=0(default didn't 
    change ), y=1 [ expected no short 
    circuit y is incremented later and 
    hence a =0 ]
    
  2. 引用问题1。

    a = 10 || ++x && y++ 
    

实际值:

 a=1, x=0,y=0

我的预期:

 a = 0, x=0, y=1 

解释:10 ||++x(短路)

所以我仍然使用 a = (1 && y++) => a=0(没有短路,并且 y 有后增量)因此 a =0,​​y=1。

如何理解我的问题2;我想我错过了什么。

最佳答案

||&& 都强制从左到右求值。 && 的优先级高于 ||1,所以 a || b && c 被解析为 a || (b && c)。请记住,使用 a || b,如果a不为零,那么无论b的值如何,表达式的结果都是1,所以b 根本不被评估。所以在表达式 a || (b && c),如果 a 不为零,则 (b && c) 不被计算。

所以,给定 a = 10 || x++ &&++y10是非零的,意思是无论x++ &&++y的结果如何,表达式的结果都是1,所以 x++++y 都不会被评估。


  1. 优先级控制表达式的解析方式(哪些运算符与哪些操作数分组)——它控制表达式求值的顺序。

关于c - 如何理解背靠背运营商的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54734345/

相关文章:

c - 在 C 语言中交换文件中的行

JavaScript 编码技术还是糟糕的代码?

c++ - C 中的逻辑运算符和位操作

C#- |和 & 运算符?

c - 缩进很奇怪——修复或选择一个替代方案

c++ - 使用 C++ 在 Linux 中挂载网络驱动器

c++ - 为什么字符数组不给出无符号结果

lua - 混合逻辑和关系运算符的评估顺序?

java - spring中条件注解的排序评估

C++ 优先级和关联性