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

C++ postfix operator precedence with boolean AND

直到今天我还以为我理解了 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 运算符会产生意想不到的结果。

i++ 递增 i 但表达式的结果是 0 (递增是副作用)。所以表达式 i++ && j++ 永远不会计算 && 运算符的右侧。

预递增运算符++i的结果是递增后的值。这就是为什么 ++i && ++j 也会递增 j.

请注意,其中 none 与优先级有关。最重要的是准确理解 pre 和 post 增量运算符之间的区别。另一个因素是 && 运算符被定义为 "short circuit" - 如果左侧的计算结果为 0,则它 不得 计算表达式的右侧.