include <stdio.h>
int A[]={1,2,3,4,5,6,7};
#define
Length sizeof(A)/sizeof(A[0])
int main()
{
int d=-1;
printf("%d/n",d<(sizeof(A)/sizeof(A[0])-2));
}
为什么输出0?
解释:
-1<7-2
左边-1为int,右边为size_t,即unsigned
类型提升是这样的:int-->unsigned->long int->unsigned long int
所以将-1的二进制码0xffffffff解释成了很大的unsigned int整数,自然会大于5而导致比较结果为false
类型转换规则:
1. 如果其中一个操作数为long double类型,则另一个操作数被转换为long double.
2. 否则,如果其中一个操作数为double,
则另一个操作数被转换为double.
3. 否则,如果其中一个操作数为float, 则另一个操作数也转换为float.
4.
否则,两个操作数进行 "整型升级":
a. 如果其中一个操作数为unsigned long int, 则另一个操作数也被视为unsigned
long int.
b. 否则,如果其中一个操作数为long int,而另一个操作数类型是unsigned int, 并且long
int能够表示unsigned int的所有值,则另一个操作数也被视为long int;如果long int不能表示unsigned
int的所有值,则两个数都被视为unsigned long int.
c. 否则, 如果其中一个操作数是long
int,则另一个操作数也被视为long int.
d. 否则, 如果其中一个操作数是unsigned int,
则另一个操作数也被视为unsigned int.
e. 否则, 两个操作数都被视为int.