【问题标题】:for loop with unsigned char gives unexpected behavior带有 unsigned char 的 for 循环给出了意外的行为
【发布时间】:2018-01-20 18:23:18
【问题描述】:

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

这个循环会执行多少次?

  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;

循环仍然是无限的。

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

【问题讨论】:

  • 如果我没记错的话,这应该会导致无限循环。
  • 但请注意“是什么让这是一个好的面试问题?”这里是题外话。
  • "if (i 显然总是正确的,因为 iunsigned char

标签: c++


【解决方案1】:

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

2 * half_limit

half_limitunsigned char2int。所以half_limit被提升为int,结果是整数300

i &lt; 2 * half_limit

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

但在++i 中不涉及任何提升,并且i 是声明的unsigned char。所以在到达255 之后,它又回到0 并且条件i &lt; 2 * half_limit 始终为真,因为i 永远不会到达300

第二个条件if (i &lt;= 255) 的情况与i 在进行此检查之前返回到0 相同。

【讨论】:

  • "并且i 是声明的unsigned int"它实际上是unsigned char。小错字;>
  • 很好的答案 - 感谢您纠正错字:)
【解决方案2】:

C/C++ 必要时扩展表达式的位容量。它被称为Integer type promotion

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

【讨论】:

  • 这如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2015-11-09
  • 1970-01-01
  • 2018-05-08
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多