#include <stdio.h> int i; int main() { i--; if (i > sizeof(i)) { printf(">\n"); } else { printf("<\n"); } return 0; }
上述代码的运行结果是什么?
首先,我们可以分析一下,i 是一个全局变量,所以在它没有被初始化的条件下,编译器默认初始为0(注意:无初始化的前提下,局部变量编译器默认初始化为随机值,全局变量默认初始化为0)所以,当i进入条件语句i的值被修改成-1。
其次,i是一个整型,而sizeof的返回值为无符号整型,当整形和无符号整型作比较时,会被算术转换为无符号整型,即整型的-1被转换成无符号整型(算术转换的定义及顺序,请看文章末尾)。众所周知-1在内存中的补码为11111111111111111111111111111111。将它转换成无符号数,是一个非常大的数,所以i的值远远大于sizeof(i)(4)。
即这道题的运行结果是:
printf(">\n")
算数转换
如果某个操作符的各个操作数属于不同类型,那么除非其中一个操作数转换为另一个操作数类型,否则就无法进行后续操作,下面的层次体系成为寻常算数转换。
int unsigned int long int unsigned long int float double long double
算数转换顺序:左低右高,向右转换。(例如 float 和double做运算 就要将float转换成double之后才能进行运算)。
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另一个操作数的类型后执行运算。