我想知道这个循环执行多少次

时间:2018-03-28 07:59:03

标签: c++

此循环执行多少次?

unsigned char half_limit = 150;

for (unsigned char i = 0; i < 2 * half_limit; ++i)
 {
  // do something;
 }

2 个答案:

答案 0 :(得分:4)

将评论转换为适当的答案:

2*half_limit由于integer promotion导致300(链接用于C,但是同样的规则适用于C ++),但是,此值无法存储在unsigned char中( i !!!),这意味着循环变量永远无法达到它;相反,它在++i处为255时会溢出,因此会以0重新启动。

结果是无限循环(假设do something部分不修改half_limit)。

附注1:这适用于大多数常见和古老的硬件,因为它们通常具有八位宽的字符类型。但是,对于unsigned char,C ++标准的唯一要求(在C ...中只是相同)能够最小地保存0到255之间的值(实际上,没有比unsigned short更大的大小)。有符号和无符号字符大于8位是完全有效的,并且甚至存在这样的硬件(例如来自具有16位字符的TI的一些DSP)。在这样的硬件上,循环将运行300次!

附注2:如果do something部分中没有可见的副作用,则允许编译器完全优化循环,因此可能根本不运行;但是,我们在无限循环的情况下有未定义的行为(参考Jarod的answer)!

结论:只要我们不知道我们正在运行的硬件,do something部分真正包含什么以及哪个编译器与哪些优化标志一起使用,我们实际上无法分辨什么都没有...

答案 1 :(得分:0)

i < 2 * half_limit

,我们有整数提升:我们将i300进行比较。

i,因为unsigned char永远不会达到这个限制。

unsigned char的溢出定义明确,并包围最大值。

所以循环无限。

所以,除非// do something;执行任何操作:

  • 调用库I / O函数
  • 可以访问或修改易失性对象
  • 或执行同步操作或原子操作

代码将是Undefined Behavior(UB)