#include <stdio.h>
int main()
{
int i = 1024;
for (; i; i >>= 1)
printf("Hi");
return 0;
}为什么for循环打印Hi 11次?我不明白。
发布于 2022-02-09 10:01:29
表达式i >>= 1等价于i = i / 2
因此,如果最初i等于1024,那么循环的主体将对值执行。
1024 512 256 128 64 32 16 8 4 2 1那是11次。由于整数运算,表达式1 / 2的值等于0。
您可以通过更改printf的调用来检查这一点,如
#include <stdio.h>
int main( void )
{
int i = 1024;
for (; i; i >>= 1) printf( "%d ", i );
putchar( '\n' );
}发布于 2022-02-09 11:20:24
按位右移操作符的示例:
int x = 1024
int z = x >>=1 # right shift operator
// then printing z will print 512, i.e. x/2因此,如果您继续使用for循环更新z的值,在您的示例中更新'i‘的值时,您将看到'i’或'z‘的值将低到1(因为'i’是int类型)。
# include <stdio.h>
# include <iostream>
int main()
{
int i = 1024;
for (; i; i >>= 1)
std::cout << "\n" << i;
return 0;
}在您的代码中,因为i= 1024 (2^10)最多可被2除以11次,因此循环打印"Hi“11次,其中i= 1024,512,....2,1。
查看此链接以获得更多详细信息:https://en.cppreference.com/w/cpp/language/operator_assignment
发布于 2022-02-09 14:19:38
>>=操作符通过其右侧的值将二进制数的位移到右边,并将结果分配给变量。这里,i被1移到了右边。最不重要(最右边)位被丢弃。
for中间的循环条件是i,这与i != 0等价,因为非零值在C中被认为是“真实的”和零的"falsey“。
1024是二进制的0b10000000000,即1跟10零。它将向右移动11次,直到1“脱落”并只留下0,这将导致循环条件不再为真。
(正如在其他答案中所指出的,向右移动1位等于整数除法2,因为每一个二进制数字的值进一步向左实际上是比以前的值大2倍(1、2、4、8等),就像十进制的数值是10的幂(1、10、数百等))。然而,这与这个问题并不真正相关,因为正如上文所述,我们可以留在双边投资条约的世界中。同样,即使整数除法放弃小数部分,这也不是1 >> 1为零…的原因)
https://stackoverflow.com/questions/71047328
复制相似问题