在这个程序中,当没有在for循环中使用时,TOTAL_ELEMENTS
会正确计算。第一张打印出来的指纹是正确的。但是,即使循环中的条件为真,为什么第二个printf也不能工作。TOTAL_ELEMENTS
返回7
。-1<7-2
I.-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;
}
发布于 2014-12-21 15:36:30
问题是sizeof
返回一个unsigned
值。因此,整个表达式
TOTAL_ELEMENTS-2
被认为是unsigned
。接下来发生的事情是比较d <= (TOTAL_ELEMENTS-2)
被认为是一个无符号比较。但是,-1
在unsigned
表示中是最大的可能值,因此<=
在第一次迭代中被计算为false
。
可以通过添加显式强制转换来强制进行签名比较:
for(d=-1;d <= (int)((TOTAL_ELEMENTS)-2);d++)
演示。
发布于 2014-12-21 15:42:09
您的新代码应该是:
#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
转换为整数。它不是一个变量。
发布于 2014-12-21 15:35:37
TOTAL_ELEMENTS是一个常量,不能用作变量。
https://stackoverflow.com/questions/27590815
复制相似问题