带有unsigned char的for循环会产生意外行为

use*_*545 4 c++

我正在练习面试问题,但我对这个基本问题很难:

这个循环执行多少次?

  unsigned char half_limit = 150;

  for (unsigned char i = 0; i < 2 * half_limit; ++i)
  {
      std::cout << i;
  }
Run Code Online (Sandbox Code Playgroud)

我的想法是,因为unsigned int只达到255,所以它将永远执行,因为当我在255处递增unsigned char时它将恢复为0?然而,这种想法是错误的,更奇怪的是,这是输出cout给我的:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????    
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下内容限制外观时:

if (i <= 255)
  std::cout << i;
else
  break;
Run Code Online (Sandbox Code Playgroud)

循环仍然是无限的.

我的问题是代码的预期结果是什么,为什么会这样?

tas*_*oor 8

这是一个无限循环.让我们一步一步地看一下:

2 * half_limit

half_limitunsigned char2int.所以half_limit升级到int结果是整数300.

i < 2 * half_limit

由于右手大小int,i也被提升为int.这里没有问题.

但是,++i没有任何促销活动,并且iunsigned char宣布的.因此,在达到255它之后回到0并且条件i < 2 * half_limit始终是真实的,因为i永远不会达到300.

这种情况是同你的第二个条件if (i <= 255)i追溯到0这个检查才制成.

  • "和`i`是一个`unsigned int`声明为"它实际上是`unsigned char`.小错字;> (2认同)