值保留原则

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 ");  

    }  else  {  

        printf("-1 ");

 }

 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

原文地址:https://www.cnblogs.com/rohens-hbg/p/4770321.html