【问题标题】:Why #define is not working in for loop? [duplicate]为什么#define 在 for 循环中不起作用? [复制]
【发布时间】:2014-12-21 15:29:26
【问题描述】:

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

【问题讨论】:

标签: c c-preprocessor


【解决方案1】:

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

TOTAL_ELEMENTS-2

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

您可以通过添加显式强制转换来强制进行有符号比较:

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

Demo.

【讨论】:

  • 我认为 sizeof 正在返回一个有符号整数。
  • sizeof 可以认为是一个无符号长整数!!@PankajMahato
  • @user12448 对于某些平台,您只能这么说。 sizeof exprsizeof(type) 产生 size_t 类型的值。 size_t 实际上是一个无符号类型的typedef,它是在几个头文件中声明的。在我的 64 位 Windows 机器上,size_t 是 64 位,而 unsigned long 是 32 位。假设它们相同可能会导致问题。
  • 对于long int 它实际上取决于架构!在 64 位架构中是 64 位,在 32 位架构中是 32 位!
【解决方案2】:

你的新代码应该是:

#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 在对其进行操作之前转换为整数。它不是一个变量。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 没有人将其用作变量。
    • TOTAL_ELEMENTS 的正确名称是一个类似对象的宏,因为它在使用它的代码中看起来像一个数据对象,而常量是一个符号名称!!
    猜你喜欢
    • 2021-05-16
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多