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

编辑 :

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

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

上面的函数程序打印 true。

4

6 回答 6

44

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

要获得 2 的 8 次方,您需要使用循环(循环中的 res *=2),或在 math.h 中舍入 pow 函数(请注意,math.h 函数返回 float - 因此不会t 等于整数)。

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

关于编辑部分:

欢迎来到运算符优先的精彩世界。发生的情况是 == 比 ^ 具有更高的优先级,因此条件计算为 2^0,即 2,这是真的。

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

if ( (2^8) == (1<<8) ) ...
于 2012-07-23T07:08:56.877 回答
12

问题是^位异或运算符,而不是提高功率。让我们2^8以按位格式解释:

2 = 0010
8 = 1000
======== xor
10= 1010

所以结果,一点一点地应用异或,是10,这永远不会发生,所以你的循环永远不会退出。如果您使用pow(2,8)并舍入为整数,则可以使单元测试正常工作。

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

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

if((2^8) == (1<<8))

正如预期的那样,这将返回错误。

于 2012-07-23T07:09:33.603 回答
6

2^82 XOR 8,即。10,而不是 256。因此你的循环不会停止。您可能想(1<<8)专门检查其中一个或 256。

于 2012-07-23T07:09:25.583 回答
3

^不是 c 中的幂,它的意思是XOR. 2^8==10 并且在此代码中它不等于 i 。

于 2012-07-23T07:10:17.423 回答
1

^ 是按位异或,您要查找的函数是 math.h 中的 pow :)

于 2012-07-23T07:11:39.883 回答
1

对于您的编辑部分

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

它将返回False

于 2012-07-23T07:36:37.860 回答