评估以下表达式

时间:2013-06-21 15:45:01

标签: c expression operator-precedence

以下代码段:

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是错误的。为什么会这样?

3 个答案:

答案 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时,在乘法之前是否进行加法并不重要 - 它不会改变比较的结果。并且在实践中这会被评估为左到右边。这样你就得到了你观察到的结果。

另见this earlier answer

答案 2 :(得分:0)

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

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