2个类似的C程序,宏生成不同的输出

J..*_*..S 0 c macros gcc

以下代码不打印任何内容:

#include<stdio.h>
#define TOTAL_SIZE ( (sizeof(array))/(sizeof(array[0])) )
int main()
{
    int array[]={1,2,3}, d;
    for(d=-1; d<=TOTAL_SIZE-2; ++d)
    {
        printf("%d\n", array[d+1]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

d = -1 <= 3-2
打印数组[-1 + 1],即数组[0]
d = 0 <= 3-2
打印数组[0 + 1],即数组[1]
d = 1 <= 3 -2
打印数组[1 + 1],即数组[2]

但即使是单个元素也不会被打印出来!



但是这段代码产生了打印数组中所有元素的正确输出:

#include<stdio.h>
#define TOTAL_SIZE ( (sizeof(array))/(sizeof(array[0])) )
int main()
{
    int array[]={1,2,3}, d;
    for(d=0; d<=TOTAL_SIZE-1; ++d)
    {
        printf("%d\n", array[d]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但两个循环的净效应似乎是相同的.

如果我们用TOTAL_SIZE数组中的元素数替换宏,它就可以工作.所以问题似乎与宏有关.

但是当我尝试打印生成的值时TOTAL_SIZE,它会打印正确的值.

第一个程序有什么问题?

小智 8

与宏的问题是,sizeof返回的size_t是一个无符号您要比较的整数类型签字 int.解决方案是将您的尺寸投射到int.

#define TOTAL_SIZE (int)( (sizeof(array))/(sizeof(array[0])) )

  • Nitpick,它返回`size_t`,它是一个实现定义的无符号整数类型,但不一定是**`unsigned int`类型. (2认同)