首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么#define不在for循环中工作?

为什么#define不在for循环中工作?
EN

Stack Overflow用户
提问于 2014-12-21 15:29:26
回答 3查看 210关注 0票数 4

在这个程序中,当没有在for循环中使用时,TOTAL_ELEMENTS会正确计算。第一张打印出来的指纹是正确的。但是,即使循环中的条件为真,为什么第二个printf也不能工作。TOTAL_ELEMENTS返回7-1<7-2 I.-1<5是真的。那么这里出了什么问题?

代码语言:javascript
运行
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-21 15:36:30

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

代码语言:javascript
运行
复制
TOTAL_ELEMENTS-2

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

可以通过添加显式强制转换来强制进行签名比较:

代码语言:javascript
运行
复制
for(d=-1;d <= (int)((TOTAL_ELEMENTS)-2);d++)

演示。

票数 8
EN

Stack Overflow用户

发布于 2014-12-21 15:42:09

您的新代码应该是:

代码语言:javascript
运行
复制
#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转换为整数。它不是一个变量。

票数 0
EN

Stack Overflow用户

发布于 2014-12-21 15:35:37

TOTAL_ELEMENTS是一个常量,不能用作变量。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27590815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档