为什么这段代码有输出?

Noo*_*oor -5 c type-conversion

我想知道为什么的输出 code是什么?它说的是关系到使用SIZEfor循环体现在哪里?

#include<stdio.h>
int array[6] = {4, 5, 6, 10, -1, 0};
#define SIZE (sizeof(array)/sizeof(array[0]))
int main() {
    int i;  
    for (i= -1; i< SIZE; ++i)  printf("%d", array[i+1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ame*_*yCU 10

for (i= -1; i< SIZE; ++i)  printf("%d", array[i+1]);
Run Code Online (Sandbox Code Playgroud)

相反,初始化i0在你的循环-

for (i= 0; i< SIZE; ++i)  printf("%d", array[i]);
Run Code Online (Sandbox Code Playgroud)

之所以没有得到任何输出,是因为循环不会因有符号和无符号整数之间的比较而迭代(转换 -1 unsigned int 和得到一个非常大的值,因此条件为假).


Lun*_*din 5

sizeof运算符的结果始终size_t是保证为大于或等于的无符号整数的类型unsigned int.

因此,整个SIZE宏的结果类型是size_tunsigned int类型.

i但是,迭代器被声明为带有int签名且包含负值的普通.

在表达式中i< SIZE,存在iSIZE("通常的算术转换")相同类型的隐式类型转换.由于它是一个负数,它最终将成为一个非常大的无符号数.条件的计算结果为false,for因此循环永远不会执行.