评估以下表达式

以下代码段:

int i=-3,j=2,k=0,m; m=++i && ++j || ++k; 

可以使用两个概念进行评估,我相信:

1.由于++运算符的优先级高于逻辑运算符,因此首先计算所有增量运算符,然后&&的优先级高于|| 将被计算。在此过程中,k将递增。

2.First &&运算符将被评估。对于这个++ i和++ j将被计算。因为&&运算符的结果是1,所以不需要评估++ k.So k将不会递增。

当我在系统上尝试它时,结果certificate推理2是正确的,1是错误的。 为什么会这样?

Oli是对的……你的评价顺序令人困惑。

优先级意味着表达式被解释为:

 m = ((((++i) && (++j)) || (++k)); 

相反,说:

 m = (++(i && ++(j || (++k))) 

优先级不会改变||的LHS这一事实 操作员将始终在RHS之前进行评估。

为了提高效率,当LHS为真时,OR语句的评估(从左到右执行)停止。 没有必要开始评估RHS – 除了在表达式的同一组中之外没有“优先级”的概念(当你对表达式的值是否重要时,无论你是先做A还是B.例如: 5 + 3 * 2应该评估为11但是在评估( 5 + 6 > 3 * 2)时,在乘法之前是否进行加法并不重要 – 它不会改变比较的结果。并且在实践中这将被评估为左到右边。这样你就可以得到你观察到的结果。

另见前面的答案

&&|| 运营商强制进行从左到右的评估。 所以首先评估i++ 。 如果表达式的结果不为0,则计算表达式j++ 。 如果i++ && j++的结果不是1,则评估k++

&&|| 运算符都引入了序列点,因此在评估下一个表达式之前应用++运算符的副作用。 请注意,这一般不是这样; 在大多数情况下, 未指定评估表达式的顺序和应用副作用的顺序。