以下代码段:
int i=-3,j=2,k=0,m;
m=++i && ++j || ++k;
可以使用两个概念进行评估,我相信:
1.由于++运算符的优先级高于逻辑运算符,因此首先对所有增量运算符进行求值,然后&&优先级高于||将被计算。在此过程中,k将递增。
2.First&&运算符将被评估。对于这个++ i和++ j将被计算。因为&&的结果。 operator是1,不需要评估++ k.So k不会递增。
当我在系统上尝试时,结果证明推理2是正确的,1是错误的。为什么会这样?
答案 0 :(得分:2)
Oli是对的...你的评价顺序令人困惑。
优先级意味着表达式被解释为:
m = ((((++i) && (++j)) || (++k));
相反,说:
m = (++(i && ++(j || (++k)))
优先顺序不会改变||
运算符的LHS始终在RHS之前进行评估的事实。
答案 1 :(得分:0)
为了提高效率,当LHS为真时,OR语句的评估(从左到右执行)停止。没有必要开始评估RHS - 没有“优先级”的概念,除了在表达式的同一组内(当你对表达式的值是否重要时,无论你是先做A还是B.例如:{{1}应该评估为5 + 3 * 2
。但是在评估11
时,在乘法之前是否进行加法并不重要 - 它不会改变比较的结果。并且在实践中这会被评估为左到右边。这样你就得到了你观察到的结果。
答案 2 :(得分:0)
&&
和||
运营商强制进行从左到右的评估。因此首先评估i++
。如果表达式的结果不为0,则计算表达式j++
。如果i++ && j++
的结果不是1,则会评估k++
。
&&
和||
运算符都引入了序列点,因此在计算下一个表达式之前应用++
运算符的副作用。请注意,这一般不是这样;在大多数情况下,评估表达式的顺序和应用副作用的顺序是未指定。