size_t size = sizeof(int);
printf("%d\n", size);
int i;
for (i = 0; i < size; i++) {
printf("%d ", i);
}
以上代码(使用gcc)outptus
4
0 1 2 3
size_t size = sizeof(int);
printf("%d\n", size);
int i;
for (i = -1; i < size; i++) {
printf("%d ", i);
}
此代码(i初始化为-1)仅输出4并且循环中没有任何内容。
size_t size = sizeof(int);
printf("%d\n", size);
int i;
for (i = -1; i < (int) size; i++) {
printf("%d ", i);
}
添加强制转换使代码再次运行正常。输出是
4
-1 0 1 2 3
第二个代码出了什么问题?为什么printf在任何地方都不会出错?
答案 0 :(得分:9)
i < size
签名i
且size
未签名后,i
会在执行比较之前转换为无符号。这是所谓的通常算术转换的一部分。
当-1
转换为无符号类型时,结果是无符号类型可表示的最大可能值,因此当i < size
为i
时,-1
为false size
的任何值。
当您使用i < (int)size
时,<
的两个操作数都属于int
类型,因此不需要执行任何转换,并且由于两个操作数都已签名,因此您将获得预期的结果。
答案 1 :(得分:1)
size_t是无符号。当你将size转换为int时,你将返回到signed,并进行比较。