值保留原则
ASNI C标准规则采用值保留(value preserving)原则,就是几个整型操作数混合使用时,结果类型可能是有符合数,也可能是无符号数,取决于操作数的类型的相对大小。
#include <stdio.h>
#define SIZE_OF_ARRAY(arr) (sizeof(arr)/sizeof(arr[0]))
int main() {
int d = -1;
int a[] = {1, 2, 3, 4, 5, 6, 7};
if(d<SIZE_OF_ARRAY(a)) {
printf("1\n");
} else {
printf("-1\n");
}
return 0;
}
执行结果如下: -1
SIZE_OF_ARRAY所定义的值的类型是unsigned int 类型(以为sizeof返回的类型是无符号类型),if语句讲signed int 和 unsigned int之间测试相等性,所以d被升级为unsigned int 类型。-1转换成unsigned int类型时为一个巨大的值,所以表达式为假。
如果将SIZE_OF_ARRAY的返回结果强制转换为int,由于两边类型一致,结果会如下:
if(d<(int)(SIZE_OF_ARRAY(a)))
执行结果如下: 1