意图 - >仅在范围内添加偶数的程序
奇怪的行为 - >逻辑语句对于添加偶数是不正确的,而逻辑语句对于添加奇数是正确的,但偶数的总和是结果。众所周知,如果num为奇数,则num & 1
返回true,如果num为偶数,则返回false。
问题 - >检查代码中的逻辑语句。为什么n的增量与逻辑运算符内联,反转返回值并求和偶数(这是预期的,但对于这个逻辑语句是意外的)?
//program to print sum of even numbers
#include <iostream>
int main(){
int n = {0}, result = {0};
while(n < 99) result += n++ & 1 ? n : 0;
std::cout << result << '\n';
}
在尝试按位奇数检测的简单编码实现时,我遇到了一些随机行为。 num & 1
当我没有使用任何否定时,这将返回0到100之间的偶数nums的期望值和适当值。例如~num & 1
。有人可以向我解释为什么这种否定是不必要的,以及为什么它的价值会回归?是否有一些额外的行为发生在n ++上?
注意:我理解语法是钝的,这是我的意图,为了尝试语言而尽可能地迟钝。我不是要求风格批评。
实施例
https://repl.it/KG8Z/1&lt;这应该打印奇数,但 ++
运算符的意外副作用是什么使它打印偶数?
https://repl.it/KG8Z/0&lt; c ++
我原本期望在c ++中使用bitwise not运算符来获得所需的结果,但结果是相同的,尽管缺少逻辑not。如何解释这个奇数的行为?
答案 0 :(得分:1)
当
n++ & 1
执行,让expect n
此刻为奇数,条件为真。
应用后增量,
时n
为偶数
result += n
执行。这就是为什么它计数偶数而不是奇数。将代码修改为
while(n < 99) result += !(n++ & 1) ? n : 0;
它将计算奇数。
答案 1 :(得分:0)
条件表达式从右到左分组。第一个表达是 在上下文中转换为bool。它被评估,如果是真的,那么 条件表达式的结果是第二个的值 表达式,否则表达式的表达式。只有一个 评估第二和第三个表达式。 每个值计算和 与第一个表达相关的副作用在之前排序 与第二个或第二个相关的每个值计算和副作用 第三个表达。
因此,n
被选中&#34;在条件中的奇数n
上,但在那时,它已经增加(偶数)。
n & ~1
与!(n & 1)
不同。