如何理解背靠背运营商的行为?
How to understand the behavior of back to back operators?
虽然这是基本问题,但我对使用 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 ]
我的问题是:
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 ]
参考问题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 有 post 增量)因此 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++ && ++y
,10
是非零的,这意味着无论 x++ && ++y
的结果如何,表达式的结果都将为 1,所以 x++
] 和 ++y
都没有评估。
- 优先级 仅控制表达式的解析方式(哪些运算符与哪些操作数分组)——它不控制表达式的解析顺序表达式被评估。
虽然这是基本问题,但我对使用 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 ]
我的问题是:
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 ]
参考问题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 有 post 增量)因此 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++ && ++y
,10
是非零的,这意味着无论 x++ && ++y
的结果如何,表达式的结果都将为 1,所以 x++
] 和 ++y
都没有评估。
- 优先级 仅控制表达式的解析方式(哪些运算符与哪些操作数分组)——它不控制表达式的解析顺序表达式被评估。