2017-02-18 113 views
0

以下代码打印没有类似的C程序:2与宏产生不同的输出

#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 < = 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生成的值时,它会打印出正确的值。

第一个程序有什么问题?

+4

启用所有警告并将它们视为错误。这是保持理智的唯一方法。对于海湾合作委员会和铿锵,这是' - 墙 - 外部 - W- - 恐怖'。 –

回答

8

与宏的问题是,sizeof返回size_t这是您要比较的无符号整数签署型int。解决方案是将您的大小投射到int

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

+2

Nitpick,它返回'size_t',它是一个实现定义的无符号整数类型,但不一定是**'unsigned int'类型。 – StoryTeller

+0

是的,但size_t是* unsigned *。谢谢你的更正:) – Micha

+0

所以我的问题是比较d(它是一个有符号的数字,即-1)的初始值与sizeof返回的size_t的初始值。感谢您的帮助。 –