#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条件失败..为什么?
答案 0 :(得分:5)
因为if
正在进行“通常的算术转换”。
sizeof
运算符返回无符号类型... d
转换为无符号,使其大于arr
中的元素数。
尝试
#define TOT (int)(sizeof(arr)/sizeof(arr[0]))
或
if(d<= (int)TOT){
答案 1 :(得分:2)
这是因为sizeof
会返回无符号数字,而d
会被签名。当d
隐式转换为有罪数字,然后它比TOT
大得多。
您应该收到有关编译器中无符号签名比较的比较警告。
答案 2 :(得分:1)
TOT
的表达式是 unsigned
值,因为sizeof()
运算符始终返回无符号(正数)值。
当您将 signed
变量d
与其进行比较时,d
会自动转换为非常大的 unsigned
value,因此比TOT
更大。
答案 3 :(得分:0)
sizeof的返回类型是无符号整数....这就是为什么如果失败...因为被编译器视为签名的“d”大于TOT