直到今天,我还以为我理解了C ++运算符和precedence。我给你以下简单的代码:
int i = 0, j = 0
i++;
j++;
cout << i << ' ' << j << endl;
当然,我们希望i
和j
的输出值分别为1和1。现在如果我们尝试将增量放在一行中会发生什么?
int i = 0, j = 0
i++ && j++;
cout << i << ' ' << j << endl;
我的理由是布尔运算符对输出没有影响。但我们的输出令人惊讶i = 1
和j = 0
?那么这里发生了什么?
对我来说更奇怪的是,通过从后缀增量切换到前缀增量或使用另一个布尔运算符,结果如预期的那样。即:
//Expected i=1, j=1
++i && ++j;
//Expected i=1, j=1
i++ || j++;
P.S。我知道在一行中更新两个变量的正确用例如下所示:
i++, j++;
但好奇心得到了我的好处,现在我想知道为什么使用布尔AND
运算符会产生不足为奇的结果。
答案 0 :(得分:1)
i++
递增i
但表达式的结果为0
(增量是副作用)。因此,表达式i++ && j++
永远不会评估&&
运算符的右侧。
预增量运算符++i
的结果是递增的值。这就是++i && ++j
也增加j
。
请注意,这与优先权无关。最重要的是要准确理解前增量和后增量运算符之间的区别。另一个因素是&&
运算符被定义为&#34;短路&#34; - 如果左侧评估为0, 不得评估表达式的右侧。