在此程序中,TOTAL_ELEMENTS
在未用于for循环时正确计算。并且第一个printf正确打印。但是,即使循环中的条件为真,第二个printf也无法工作。 TOTAL_ELEMENTS
返回7
。 -1<7-2
即-1<5
是真的。那么这里有什么问题?
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
printf("Total= %d\n", TOTAL_ELEMENTS);
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
答案 0 :(得分:8)
问题是sizeof
返回unsigned
值。因此,整个表达方式
TOTAL_ELEMENTS-2
被视为unsigned
。接下来发生的事情是比较d <= (TOTAL_ELEMENTS-2)
被认为是无符号比较。但是,-1
表示中的unsigned
是最大可能值,因此<=
在第一次迭代时被评估为false
。
您可以通过添加显式广播来强制进行签名比较:
for(d=-1;d <= (int)((TOTAL_ELEMENTS)-2);d++)
答案 1 :(得分:0)
您的新代码应为:
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
printf("Total= %d\n", TOTAL_ELEMENTS);
for(d=-1;d <= ((int)TOTAL_ELEMENTS-2);d++)
{
printf("%d\n",array[d+1]);
}
return 0;
}
你需要施展
在对此进行操作之前, TOTAL_ELEMENT
为整数。它不是变量。
答案 2 :(得分:-3)
TOTAL_ELEMENTS 是一个常量,不能用作变量。