28
#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'运算符之间的区别。当我编写程序时,它们是错误的来源。

while(i)

我知道除了 0 之外的正负 i 的循环条件都是正确的。

while(!i) vs while(~i)

对于 'i' 的什么值,上述两个循环被执行?

4

4 回答 4

48

i到达 时,-1值为,或,所以循环停止执行。操作员工作是因为它做了完全不同的事情;它导致值和所有其他值。是按位否定。~i~-10while!100~

更详细一点:

  • ~获取数字中的每一位并切换它。因此,例如,10010 2将变为 01101 2
  • -1当二进制补码有符号整数时,都是二进制的。
  • ~0b…111111110

然而:

  • !01!anythingElse0
  • -1不是0
  • !-1还是0

如果你真的想循环包括i == -1,只需使用while (i)而不是while (~i).

于 2012-07-20T02:54:42.707 回答
5

你是正确i == -1的退出条件:你的循环相当于

int i=-5;
while(i != -1)
{
    cout<<i;
    ++i;
}
// i == -1 immediately after the loop

以这种方式编写时,应该清楚为什么-1不打印该值首先打印,然后才递增,这就是-2您打印的最后一个值的原因。

!另一方面,运算符只有在给定零时才会产生1。这就是为什么在循环条件中使用运算符-1时会打印循环的原因!

于 2012-07-20T02:58:20.413 回答
3

'~' 是运算符:~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

于 2012-07-20T03:22:54.870 回答
1

!是真/假逻辑翻转

!意味着any nonzero becomes 0, 和0 becomes 1

例如1。!0b1010 -> 0b0000

例2。!0b0000 -> 0b0001

例 3。!0b1111 -> 0b0000

概括地说,out = in?0:1

尽管...

~有点翻转

~方法flip each and every bit

例如1。~0b1010 -> 0b0101

例2。~0b0000 -> 0b1111

例 3。~0b1111 -> 0b0000

概括地说,out = in^0b1111

于 2020-04-06T21:58:33.550 回答