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

时间:2018-01-20 18:23:19

标签: c++

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

  

此循环执行多少次?

  unsigned char half_limit = 150;

  for (unsigned char i = 0; i < 2 * half_limit; ++i)
  {
      std::cout << i;
  }

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

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

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

if (i <= 255)
  std::cout << i;
else
  break;

循环仍然是无限的。

我的问题是代码的预期结果是什么,为什么会出现这种情况?

2 个答案:

答案 0 :(得分:8)

这是一个无限循环。让我们一步一步看看:

2 * half_limit

half_limitunsigned char2int。因此half_limit被提升为int,结果为整数300

i < 2 * half_limit

由于右手尺寸为inti也会提升为int。这里没有问题。

但在++i中,不涉及促销活动,i是宣布的unsigned char。因此,在达到255后,它会返回到0,条件i < 2 * half_limit始终为真,因为i永远不会到达300

第二个条件if (i <= 255)的情况相同,因为i在进行此项检查之前会返回0

答案 1 :(得分:2)

如果需要,C / C ++扩展表达式的位容量。它被称为Integer type promotion

根据这些规则,half_limit * 2被提升为300的整数值。假设CHAR_BIT == 8i是一个八位字节,因此它永远不会达到300的值,所以这个循环将永远持续下去。此外,无符号八位字节总是小于或等于255,因此if表达式是多余的。