使用sizeof(数组)的宏没有给出预期的输出
问题描述:
#include <stdio.h>
int arr[] = {1, 2,3,4,5};
#define TOT (sizeof(arr)/sizeof(arr[0]))
int main()
{
int d = -1, x = 0;
if(d<= TOT){
x = arr[4];
printf("%d", TOT);
}
printf("%d", TOT);
}
TOT的值为5,但if条件失败......为什么?使用sizeof(数组)的宏没有给出预期的输出
答
这是因为sizeof
返回一个无符号数,而d
签署。当d
隐式转换为单数号码,然后它比TOT
大得多。
您应该收到关于比较编译器的无符号比较的警告。
答
您的TOT
表达式是unsigned
值,因为操作者sizeof()
总是返回无符号(正)值。
当你比较signed
可变d
有了它,d
被自动转换为一个非常大的unsigned
值,并因此变得更大比TOT
。的sizeof
答
返回类型为无符号整数....这就是为什么如果失败......因为“d”由编译器作为签署了被视为比TOT更大
你有[UB](HTTP ://c2.com/cgi/wiki?UndefinedBehavior)在'printf's中:你说你会传递一个'int',但'TOT'的类型不匹配。 – pmg
@pmg实际上C编译器是否支持%zd语法?看起来甚至没有GCC做到这一点,我试着用-std = c99 -pedantic并打印出“zd”。 – Lundin
@pmg我想我有一个太过旧版本的GCC ... – Lundin