C ++后缀运算符优先级与布尔AND

时间:2017-12-02 23:40:07

标签: c++ operators post-increment

直到今天,我还以为我理解了C ++运算符和precedence。我给你以下简单的代码:

int i = 0, j = 0
i++;
j++;

cout << i << ' ' << j << endl;

当然,我们希望ij的输出值分别为1和1。现在如果我们尝试将增量放在一行中会发生什么?

int i = 0, j = 0
i++ && j++;

cout << i << ' ' << j << endl;

我的理由是布尔运算符对输出没有影响。但我们的输出令人惊讶i = 1j = 0?那么这里发生了什么?

对我来说更奇怪的是,通过从后缀增量切换到前缀增量或使用另一个布尔运算符,结果如预期的那样。即:

//Expected i=1, j=1
++i && ++j;

//Expected i=1, j=1
i++ || j++;

P.S。我知道在一行中更新两个变量的正确用例如下所示:

i++, j++;

但好奇心得到了我的好处,现在我想知道为什么使用布尔AND运算符会产生不足为奇的结果。

1 个答案:

答案 0 :(得分:1)

i++递增i但表达式的结果为0(增量是副作用)。因此,表达式i++ && j++永远不会评估&&运算符的右侧。

预增量运算符++i的结果是递增的值。这就是++i && ++j也增加j

的原因

请注意,这与优先权无关。最重要的是要准确理解前增量和后增量运算符之间的区别。另一个因素是&&运算符被定义为&#34;短路&#34; - 如果左侧评估为0, 不得评估表达式的右侧。