为什么没有输出?
#include <stdio.h>
int main() {
int i;
int array[4] = {10, 25, 36, 42};
// int size=sizeof(array) / sizeof(int);
for (i = -1; i < sizeof(array) / sizeof(int); i++) {
printf("%d ", array[i+1]);
}
return 0;
}
预期输出为 10 25 36 42
在 for 循环的条件表达式中
for (i = -1; i < sizeof(array) / sizeof(int); i++) {
由于通常的算术转换,具有有符号类型 i
的变量
int
被隐式转换为无符号类型
size_t
类型,因为表达式
sizeof(array) / sizeof(int)
具有无符号整数类型
size_t
以及类型
size_t
大于类型
int
的等级。结果表达式 ( sze_t )-1 是条件的左操作数 我
< sizeof(array) / sizeof(int) becomes a very big unsigned value due to propagating the sign bit.
尝试调用 printf
printf( "( size_t )-1 = %zu\n", ( size_t )-1 );
因此 of 语句的条件计算结果为逻辑假。你可以写例如
for (i = -1; i < ( int )( sizeof(array) / sizeof(int) ); i++) {
得到预期的结果。
(size_t)i < sizeof(array) / sizeof(int)
,并且
(size_t)-1
是一个巨大的数字。在这种情况下,没有理由以
i = -1
开头;使用
i = 0
可以正确且更简单地完成此操作,从而避免了当前的问题。始终启用编译器的警告。对于 gcc 或 clang,我使用
-Wall -Wextra -pedantic
。它会抓住这个。