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

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

#include  #include  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  int main(void) { if((2)^8 == 1<<8) { printf("True.. \n"); } else { printf("False..!!"); } return 0; } 

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

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

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

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

关于编辑部分:

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

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

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

问题是^是Bitwise XOR运算符,而不是上电。 让我们以按位格式解释2^8

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

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

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

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

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

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

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

^不是c中的幂,它意味着XOR 。 2 ^ 8 == 10,在此代码中它不等于i。

^是按位XOR,你正在寻找的函数是math.h 🙂

为您的编辑部分

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

它将返回False