为什么#define不能用于for循环?

时间:2014-12-21 15:29:26

标签: c c-preprocessor

在此程序中,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;
}

3 个答案:

答案 0 :(得分:8)

问题是sizeof返回unsigned值。因此,整个表达方式

TOTAL_ELEMENTS-2

被视为unsigned。接下来发生的事情是比较d <= (TOTAL_ELEMENTS-2)被认为是无符号比较。但是,-1表示中的unsigned是最大可能值,因此<=在第一次迭代时被评估为false

您可以通过添加显式广播来强制进行签名比较:

for(d=-1;d <= (int)((TOTAL_ELEMENTS)-2);d++)

Demo.

答案 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 是一个常量,不能用作变量。