【发布时间】:2020-06-07 09:39:01
【问题描述】:
我在这里https://www.toptal.com/c-plus-plus/interview-questions 找到了以下代码sn-p,问题是:这个循环将执行多少次?解释你的答案
unsigned char half_limit = 150;
for (unsigned char i = 0; i < 2 * half_limit; ++i)
{
// do something;
}
答案是无限的。
表达式 2 * half_limit 将被提升为 int(基于 C++ 转换规则),其值为 300。但是,由于我 是一个无符号字符,它由一个 8 位值重新表示,之后 达到 255,将溢出(所以它会回到 0)和循环 因此将永远持续下去。
我猜了 45 次 (300-255),因为我记得如果你增加一个无符号整数计数器,当它溢出时计数器会再次从 0 开始。好的,所以它从整数转换为无符号字符,那为什么不是 255 呢?
谢谢
【问题讨论】:
-
解释中有什么不明白的地方?如果不重复完全相同的
2 * half_limit被提升为int,很难回答,它的值是300,而i永远不能是>300,因为它是unsigned char。 -
答案是未定义的行为,除非您可以证明循环体具有可观察到的效果。没有可观察行为的无限循环是 UB,可以完全优化。
-
你说的是
Okay, so it casts from an integer to an unsigned char, why its not 255 then?,但就在你之前提到The expression 2 * half_limit will get promoted to an int -
@FrançoisAndrieux 我们不知道
// do something;是否有可观察到的行为。 -
@Ayxan 好吧,这是一条评论,所以我们知道它什么都不做 :) 如果有我们不知道的东西来代替评论,那么答案是:我们不知道知道。