使用sizeof(数组)的宏未提供预期的输出

时间:2011-11-28 10:49:15

标签: c

#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条件失败..为什么?

4 个答案:

答案 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