以下代码片段:
int i=-3,j=2,k=0,m;
m=++i && ++j || ++k;
可以使用两个概念来评估,我相信:
1.由于 ++ 运算符的优先级高于逻辑运算符,因此首先计算所有自增运算符,然后 && 的优先级高于 || 将被计算。在这个过程中,k 将被递增。
2.首先计算&&运算符。为此将计算++i和++j。由于&&运算符的结果是1,不需要计算++k。所以k不会增加。
当我在一个系统上尝试它时,结果证明推理 2 是正确的,而推理 1 是错误的。为什么会这样?
以下代码片段:
int i=-3,j=2,k=0,m;
m=++i && ++j || ++k;
可以使用两个概念来评估,我相信:
1.由于 ++ 运算符的优先级高于逻辑运算符,因此首先计算所有自增运算符,然后 && 的优先级高于 || 将被计算。在这个过程中,k 将被递增。
2.首先计算&&运算符。为此将计算++i和++j。由于&&运算符的结果是1,不需要计算++k。所以k不会增加。
当我在一个系统上尝试它时,结果证明推理 2 是正确的,而推理 1 是错误的。为什么会这样?
奥利是对的......您将优先级与评估顺序混淆了。
优先级意味着表达式被解释为:
m = ((((++i) && (++j)) || (++k));
相反,说:
m = (++(i && ++(j || (++k)))
优先级不会改变||
运算符的 LHS 将始终在 RHS 之前进行评估的事实。
为了提高效率,OR 语句(从左到右执行)的评估在 LHS 为真时停止。没有必要开始评估 RHS - 除了在同一组表达式中之外,没有“优先级”的概念(当您首先执行 A 或 B 对表达式的值很重要时。示例:5 + 3 * 2
应该评估为11
.但是在评估( 5 + 6 > 3 * 2)
时,是否在乘法之前进行加法并不重要-它不会改变比较的结果。实际上,这会从左到右进行评估。因此,您会得到观察到的结果。
另见这个较早的答案
和运算&&
符||
强制从左到右求值。所以i++
首先被评估。如果表达式的结果不为 0,则计算表达式j++
。如果 的结果i++ && j++
不是 1,则k++
计算。
和运算符都引入了序列点&&
,因此在计算下一个表达式之前应用了运算符的||
副作用。++
请注意,这通常不是真的;在大多数情况下,计算表达式的顺序和应用副作用的顺序是未指定的。