#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i=-5;
while(~(i))
{
cout<<i;
++i;
}
}
输出为-5,-4,-3,-2。 不应该打印值直到-1?为什么它只到-2。 请解释一下'not'和'negation'运算符之间的区别。当我编写程序时,它们就是bug的来源。
while(i)
我知道循环条件对于正负i是正确的,除了0。
while(!i) vs while(~i)
对于'i'的上述两个循环的执行值是什么?
答案 0 :(得分:36)
当i
到达-1
时,~i
的值为~-1
或0
,因此while
循环停止执行。 !
运算符的工作原理是因为它完全不同;对1
值产生0
,对所有其他值产生0
。 ~
是一个按位否定。
更详细一点:
~
取一个数字中的每一位并切换它。因此,例如,10010 2 将变为01101 2 -1
是二进制补码有符号整数时的二进制数。~0b…11111111
是0
。然而:
!0
为1
,!anythingElse
为0
-1
不是0
!-1
仍然是0
如果你真的想要循环包括i == -1
,只需使用while (i)
代替while (~i)
。
答案 1 :(得分:5)
关于i == -1
退出条件是正确的:你的循环等同于
int i=-5;
while(i != -1)
{
cout<<i;
++i;
}
// i == -1 immediately after the loop
以这种方式编写时,应该清楚为什么-1
没有打印首先打印的值,然后才增加,这就是为什么-2
是你打印的最后一个值。
另一方面,!
运算符只有在给定零时才会生成1
。这就是在循环条件中使用-1
运算符时循环将打印!
的原因。
答案 2 :(得分:2)
&#39;〜&#39;操作符是:~x = -x-1 当i = -1时,则~i = 0。 如果你想知道~i的值,你可以打印出来:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i=-5;
for (int i = -5; i <= 3; i++)
{
cout<<i<<" "<<(~i)<<endl;
}
}
然后你会发现: -5 4 -4 3 -3 2 -2 1 -1 0 0 -1 1 -2 2 -3 3 -4
答案 3 :(得分:0)
!
是对/错逻辑翻转
!
的意思是any nonzero becomes 0
,而0 becomes 1
eg1。 !0b1010 -> 0b0000
eg2。 !0b0000 -> 0b0001
eg3。 !0b1111 -> 0b0000
通用,out = in?0:1
同时...
~
有点翻转
~
的意思是flip each and every bit
eg1。 ~0b1010 -> 0b0101
eg2。 ~0b0000 -> 0b1111
eg3。 ~0b1111 -> 0b0000
通用,out = in^0b1111