我刚遇到一个问题.我想比较我的Eratostenes的Sieve是否包含素数.在代码中我有这一行
if (sieve[2] == is_prime(2)) // returns false
printf ("true");
Run Code Online (Sandbox Code Playgroud)
现在,筛[2]是一个布尔值,它的值是真的(我甚至在数组中检查过,所以毫无疑问).is_prime(2)是一个布尔值(我也检查过).
现在我的问题.上面给出的行返回false.是 - 它返回false,即使它的声明是:
if ( true == true ) // which normally returns true
printf ("true");
Run Code Online (Sandbox Code Playgroud)
但是,删除一个方程符号后:
if ( sieve[2] = is_prime(2) ) // returns true
printf ("true");
Run Code Online (Sandbox Code Playgroud)
该语句返回true.
有人可以简单地解释一下这个等式标记在这种情况下与==相比如何工作?
提前致谢
编辑
is_prime:
bool is_prime(int x) {
unsigned int i,j,k;
if (x < 2) return false;
else {
for (i=2; i!=x; i++) {
if (x == i) return true;
else if (x % i == 0) return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
筛:
const int n = 10000;
bool sieve[n+1];
.
.
unsigned long int i;
sieve[0] = sieve[1] = false;
for (i=2; i<=n; i++) sieve[i] = true;
for (i=2; i*i<=n; i++) {
if (sieve[i]) {
unsigned tmp = 2*i;
while (tmp <= n) {
sieve[tmp] = false;
tmp += i;
}
}
}
Run Code Online (Sandbox Code Playgroud)
[编辑2]问题在于"is_prime(x)"将循环条件从"i!= x"更改为"i <= x"对不起,感谢您的回答
bool is_prime(int x) {
unsigned int i,j,k;
if (x < 2) return false;
else {
for (i=2; i!=x; i++) {
if (x == i) return true;
else if (x % i == 0) return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
你的is_prime()(上面)被破坏,具有未定义的行为,因为它x是2(或实际上任何实际的素数)它到达函数的末尾而没有return语句 - i!=x测试意味着x == i循环内部永远不会true.
is_prime(2)它可能会有效地返回随机结果(基于剩余堆栈或寄存器内容/在您记录的输出中它似乎"返回" x自身,可能是因为您的ABI使用相同的CPU寄存器或堆栈地址传递参数并传回函数的返回值).
特别是对于2,流进入第一个else子句,然后i=2第一个i!=x测试失败并且for循环立即退出...在范围return之后没有for.最小化的代码(更快的实现是可能的,但保持简单性和预期的逻辑):
bool is_prime(int x)
{
if (x < 2) return false;
for (int i = 2; i < x; ++i)
if (x % i == 0)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
==通过sieve[2] == is_prime(2)它检查它们具有相同的值 - 可能在转换其中一个值以启用比较之后,但是你说它们都是布尔值,因此没有必要.if当它们是两者true或两者时,这将产生"真实"值false.
现在我的问题.上面给出的行返回false.是的 - 即使......它也会返回false
这没有任何意义......我建议你在if语句之前添加以下内容来检查变量的值:
std::cout << "sieve[2] " << sieve[2] << " (bool)" << (bool)sieve[2]
<< ", is_prime(2) " << is_prime(2) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我甚至检查了阵列,所以毫无疑问
警惕错误,比如看到数组内容显示ala {true false true false}而思考[2]是第二个值...它实际上是第三个.因为数组索引从0开始.
=与sieve[2] = is_prime(2)你指定的值is_prime(2)入sieve[2],而if如果该值在布尔环境视为真实的陈述被认为是"真"(即它与值的Boolean true,或者非0号或指针等).对于大多数数据类型,执行流程if (sieve[2] = is_prime(2)) ...与简单相同if (is_prime(2)) ...,但当然也会修改sieve[2].