当i为512时,条件检查“i == (2^8)”失败了吗?

17

这是一个打印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;
}

当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....

编辑:

感谢回答,^ 是一种异或操作符。但现在下面的代码表现奇怪,请解释一下。

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

上面的函数程序输出true。


2
由于似乎每个人都没有提到它,我在这里注明一下:在支持的语言中,标准的指数运算符是双星号,例如 28、73 等等... - Thomas
@Thomas 谢谢。但是在C语言中它显示语法错误。 - Sandeep
1
C不是那些语言之一。它只是一个奖励,以防您遇到使用它的语言(例如Python、某些Pascal方言或Java)。 - Thomas
3
在一些BASIC方言中,符号^是指数运算符。虽然我没有在其他语言中看到过它。 - Ferruccio
对于一个良好的问题,包含所有相关源代码和错误执行示例,给予+1。但总的来说,编辑正处在一个界限上,最好提出关于这个谜团的新问题,因为它实际上并没有澄清“这个”问题。 - RBerteig
@RBerteig 谢谢。我自己编辑了问题。在发布问题之前,我编写了一个小程序(编辑部分),并检查它们是否相同。在那里它返回true,在原始程序中它返回false。现在事情清楚了。谢谢SO。 - Sandeep
6个回答

44
在C语言中,^运算符表示异或(按位异或)。
要得到2的8次方,你需要使用循环(在循环中使用 res *=2),或者四舍五入math.h中的pow函数(请注意,math.h函数返回浮点数,因此不等于整数)。
当然,最简单的方法是按位移动。
关于编辑部分:
欢迎来到运算符优先级的奇妙世界。发生的情况是==比^具有更高的优先级,因此条件计算为2^0,即2,这是true。
要使其正常工作,您需要添加括号。
if ( (2^8) == (1<<8) ) ...

请查看我在问题中的编辑部分。 - Sandeep
谢谢。现在清楚了。但是为什么它会计算为2^0呢?即使它是2^0,也就是2,当与1进行比较时如何返回1? - Sandeep
8
不不,8 == (1<<8) 的结果是0,然后将其异或2,结果为2。如果(x)为真,则进入“真”条件,即当x不为0时,所以你会得到“True...”。 - Guy Adini
请注意,math.h函数返回浮点数 - 因此不等于整数。不,pow(3)返回一个双精度浮点数,因此在32位整数的整个范围内(以及大多数64位整数)都是准确的。 - user79758

12
问题在于^按位异或运算符,而不是求幂。让我们用按位格式来解释2^8
2 = 0010
8 = 1000
======== xor
10= 1010

因此,逐位应用异或的结果为10,这从未发生过,因此您的循环永远不会退出。如果使用pow(2,8)并四舍五入为整数,则可以使单元测试正常工作。
另一个信息是,虽然在这个例子中可能不是这种情况,但最好避免使用浮点值的严格相等性,在比较时使用epsilon更好。
对于您的编辑,请确保使用以下优先级:
if((2^8) == (1<<8))

这将返回false,符合预期。

6

2^8 表示 2 XOR 8,即为 10,而不是 256。因此你的循环不会停止。你可能想要检查是否等于 (1<<8) 或者特定的值 256。


3

^ 在 C 语言中不代表乘方,而是表示按位异或(XOR)。2^8==10,这段代码中它的值不等于 i。


1

关于你的编辑部分

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

它将返回 False

1
你可能想解释一下为什么它返回false。 - Bo Persson

1

^ 是按位异或运算符,你要找的函数在 math.h 库中是 pow() :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接