两个真正的变量在(tmp1 == tmp2)中返回false.为什么?

Mac*_* Pk -3 c++ if-statement

我刚遇到一个问题.我想比较我的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"对不起,感谢您的回答

Ton*_*roy 6

UPDATE

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()(上面)被破坏,具有未定义的行为,因为它x2(或实际上任何实际的素数)它到达函数的末尾而没有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].