C++随机按位行为

C++ random bitwise behavior

本文关键字:随机 C++      更新时间:2023-10-16

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

奇怪的行为->逻辑语句对偶数的加法不正确,相反,逻辑语句对奇数相加是正确的,但偶数之和是结果。众所周知,如果 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 之间的偶数数字的所需和适当的值。比如~num & 1.有人可以向我解释为什么否定不是必需的,为什么它返回偶数值?n++ 是否发生了一些额外的行为?

注意:我知道语法是迟钝的,这是我的意图,为了对语言进行一些实验,尽可能迟钝。我不是在要求风格批评。

例子

https://repl.it/KG8Z/1 <这应该打印奇数,但是>++运算符的意外副作用是什么,使其打印偶数?

https://repl.it/KG8Z/0 <C++>

https://repl.it/KGId/3<蟒蛇>

我预计需要在 c++ 中使用按位 not 运算符来获得所需的结果,但尽管没有逻辑 not,但结果是相同的。如何解释这种奇怪的行为?

n++ & 1

执行,让我们期望n目前是奇数,条件为真。

应用后递增,n

result += n

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

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

它会算奇数。

[expr.cond]/1

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

因此,n在条件中的奇数n上被"选择",但在这一点上,它已经递增(偶数(。


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