我正在练习面试问题,但我对这个基本问题很难:
此循环执行多少次?
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;
循环仍然是无限的。
我的问题是代码的预期结果是什么,为什么会出现这种情况?
答案 0 :(得分:8)
这是一个无限循环。让我们一步一步看看:
2 * half_limit
half_limit
为unsigned char
,2
为int
。因此half_limit
被提升为int
,结果为整数300
。
i < 2 * half_limit
由于右手尺寸为int
,i
也会提升为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 == 8
,i
是一个八位字节,因此它永远不会达到300的值,所以这个循环将永远持续下去。此外,无符号八位字节总是小于或等于255,因此if
表达式是多余的。