可能重复:
一个谜语(在C中)
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是,这TOTAL_ELEMENTS是一个无符号值,并且在你正在尝试这个的实现上,它可能是unsigned long int.比较将尝试将d,, 的整数值提升-1为a unsigned long,这将导致类似0xFFFFFFFFFFFFFFFF并且大于7-2 = 5(结果TOTAL_ELEMENTS-2); 因此,循环条件被评估为false并且从不执行正文.如果您明确地抛弃unsigned了比较运算符的右侧,它应该可以正常工作:
for(d=-1;d <= (int)(TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,COUNTOF宏通常定义为:
#define COUNTOF(x) ((sizeof((x))/sizeof(*(x)))
Run Code Online (Sandbox Code Playgroud)
和像是一样使用COUNTOF(array),而不是为每个数组定义一个宏.然而,这不是你看到问题的原因; 你的宏在这里正确使用.这与问题完全正交,它只是一种编码风格的建议.)
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |