unsigned char half_limit = 150;
for (unsigned char i = 0; i < 2 * half_limit; ++i)
{
// do something;
}
答案 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
中,我们有整数提升:我们将i
与300
进行比较。
i
,因为unsigned char
永远不会达到这个限制。
unsigned char
的溢出定义明确,并包围最大值。
所以循环无限。
所以,除非// do something;
执行任何操作:
代码将是Undefined Behavior(UB)