C++ 后缀运算符优先级与布尔值 AND
C++ postfix operator precedence with boolean AND
直到今天我还以为我理解了 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
运算符会产生意想不到的结果。
i++
递增 i
但表达式的结果是 0
(递增是副作用)。所以表达式 i++ && j++
永远不会计算 &&
运算符的右侧。
预递增运算符++i
的结果是递增后的值。这就是为什么 ++i && ++j
也会递增 j
.
请注意,其中 none 与优先级有关。最重要的是准确理解 pre 和 post 增量运算符之间的区别。另一个因素是 &&
运算符被定义为 "short circuit" - 如果左侧的计算结果为 0,则它 不得 计算表达式的右侧.
直到今天我还以为我理解了 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
运算符会产生意想不到的结果。
i++
递增 i
但表达式的结果是 0
(递增是副作用)。所以表达式 i++ && j++
永远不会计算 &&
运算符的右侧。
预递增运算符++i
的结果是递增后的值。这就是为什么 ++i && ++j
也会递增 j
.
请注意,其中 none 与优先级有关。最重要的是准确理解 pre 和 post 增量运算符之间的区别。另一个因素是 &&
运算符被定义为 "short circuit" - 如果左侧的计算结果为 0,则它 不得 计算表达式的右侧.