当我是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^8
是2 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 。