C ++随机按位行为

时间:2017-08-11 17:08:32

标签: c++ bit-manipulation bitwise-operators

意图 - >仅在范围内添加偶数的程序

奇怪的行为 - >逻辑语句对于添加偶数是不正确的,而逻辑语句对于添加奇数是正确的,但偶数的总和是结果。众所周知,如果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 ++

https://repl.it/KGId/3&lt;蟒

我原本期望在c ++中使用bitwise not运算符来获得所需的结果,但结果是相同的,尽管缺少逻辑not。如何解释这个奇数的行为?

2 个答案:

答案 0 :(得分:1)

n++ & 1

执行,让expect n此刻为奇数,条件为真。

应用后增量,

n为偶数
result += n

执行。这就是为什么它计数偶数而不是奇数。将代码修改为

while(n < 99) result += !(n++ & 1) ? n : 0;

它将计算奇数。

答案 1 :(得分:0)

[expr.cond]/1

  

条件表达式从右到左分组。第一个表达是   在上下文中转换为bool。它被评估,如果是真的,那么   条件表达式的结果是第二个的值   表达式,否则表达式的表达式。只有一个   评估第二和第三个表达式。 每个值计算和   与第一个表达相关的副作用在之前排序   与第二个或第二个相关的每个值计算和副作用   第三个表达。

因此,n被选中&#34;在条件中的奇数n上,但在那时,它已经增加(偶数)。

n & ~1!(n & 1)不同。