C++随机按位行为
C++ random bitwise behavior
意图-> 仅在一定范围内添加偶数的程序
奇怪的行为->逻辑语句对偶数的加法不正确,相反,逻辑语句对奇数相加是正确的,但偶数之和是结果。众所周知,如果 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)
不同.
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- GCC:随机构建导致执行期间分段错误
- 如何使用 SML 随机生成八进制元组
- 当我尝试使用它时,Scanf 会抛出一个随机异常(scanf_s 也是如此)
- 将正态随机变量与任意 RHO(corrcoef) 相关联