当我是512时,条件检查"i ==(2 ^ 8)"失败?

mk.*_*k.. 17 c

这是一个小程序打印2到8的功率.但它不会在8后退出.请解释原因.

#include <stdio.h>
#include <unistd.h>
int main(void)
{
        unsigned int i=1;
        while(1) {
                i = i<<1;
                printf("i = %d\n",i);
                if(i==(2^8))
                        break;
                sleep(1);
        }
        printf("Exited While loop.. \n");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

当i = 2 ^ 8时,循环不会退出.我的输出是这样的:

i = 2
i = 4
i = 8
i = 16
i = 32
i = 64
i = 128
i = 256
i = 512 (Should have Exited here. But the program is continuing. Why?)
i = 1024
i = 2048
i = 4096....
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢您回答^是XOR运算符.但现在下面的代码表现得很奇怪.请解释.

#include <stdio.h>
int main(void)
{
        if((2)^8 == 1<<8) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的函数程序打印为true.

Guy*_*ini 44

在C中,^运算符表示XOR(按位异或).

要获得8的幂,你需要使用一个循环(循环中的res*= 2),或者在math.h中舍入pow函数(注意math.h函数返回float - 因此赢了' t等于整数).

当然,最简单的方法是按位移位.

关于编辑部分:

欢迎来到运营商优先的精彩世界.会发生什么是==具有比^更高的优先级,因此条件求值为2 ^ 0,即2,这是真的.

要使其工作,您需要添加括号:

if ( (2^8) == (1<<8) ) ...
Run Code Online (Sandbox Code Playgroud)

  • 不,8 ==(1 << 8)评估为0,然后用2进行评分,评估为2.如果x不是0,则(x)转到"true"子句,所以你得到"真正...". (8认同)

Fel*_*ano 12

问题是,^按位异或操作,不会引发权力.我们2^8以按位格式解释:

2 = 0010
8 = 1000
======== xor
10= 1010
Run Code Online (Sandbox Code Playgroud)

因此,逐位应用xor的结果是10,这从未发生过,所以你的循环永远不会退出.如果您使用pow(2,8)并舍入为整数,则可以使单元测试工作.

另一个信息,在这个例子中可能不是这种情况,但最好在使用浮点值时避免严格相等,与epsilon相比更好.

对于您的编辑: 确保优先级:

if((2^8) == (1<<8))
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这将返回false.


Has*_*kun 6

2^8就是2 XOR 8,即.10,而不是256.因此你的循环不会停止.你可能想要特别检查(1<<8)256或256.