0

以下代码片段:

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

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

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

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

2.首先计算&&运算符。为此将计算++i和++j。由于&&运算符的结果是1,不需要计算++k。所以k不会增加。

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

4

3 回答 3

2

奥利是对的......您将优先级与评估顺序混淆了。

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

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

相反,说:

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

优先级不会改变||运算符的 LHS 将始终在 RHS 之前进行评估的事实。

于 2013-06-21T16:25:49.183 回答
0

为了提高效率,OR 语句(从左到右执行)的评估在 LHS 为真时停止。没有必要开始评估 RHS - 除了在同一组表达式中之外,没有“优先级”的概念(当您首先执行 A 或 B 对表达式的值很重要时。示例:5 + 3 * 2应该评估为11.但是在评估( 5 + 6 > 3 * 2)时,是否在乘法之前进行加法并不重要-它不会改变比较的结果。实际上,这会从左到右进行评估。因此,您会得到观察到的结果。

另见这个较早的答案

于 2013-06-21T15:49:35.613 回答
0

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

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

于 2013-06-21T20:23:11.093 回答