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

时间:2017-02-18 17:22:00

标签: c gcc macros

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

#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;
}

d = -1&lt; = 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;
}

但两个循环的净效果似乎相同。

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

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

第一个程序有什么问题?

1 个答案:

答案 0 :(得分:8)

宏的问题是sizeof返回size_t这是无符号整数类型,您要与签名 {进行比较{1}}。解决方案是将您的尺寸转换为int

int