【问题标题】:I am not getting desired output for this C program我没有得到这个 C 程序所需的输出
【发布时间】:2014-01-24 00:03:46
【问题描述】:
#include<stdio.h>
#define TOTAL_NO (sizeof(array) / sizeof(array[0]))
int array[]={23,34,12,17,204,99,16};

int main()
{         


int d;
for(d=-1; d<=(TOTAL_NO-2); d++)
printf("%d\n",array[d+1]);

return 0;

}

为什么这个程序不显示数组的内容? 错误在哪里?

【问题讨论】:

  • 为什么不for(d = 0; d &lt; TOTAL_NO; d++) printf("%d\n", array[d]);
  • sizeof(int) 返回一个未指定的 int。或 size_t 结构,其中包含一个 uint32_t。

标签: c arrays c-preprocessor


【解决方案1】:

TOTAL_NO 返回一个类型为size_t 的值。这是无符号的,所以 d 在循环退出条件中被转换为无符号的测试 d&lt;=(TOTAL_NO-2)

假设是 32 位整数,这会进行初始测试

0xffffffff <= 7

这显然失败了,阻止了循环运行。

如果将其更改为,循环将按预期运行

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

将循环更改为更正常的形式

for(d=0; d<TOTAL_NO; d++)

也可以。这是更可取的,因为它会产生更清晰、更易于维护的代码

【讨论】:

  • 是的,现在它工作正常,我忘记了 sizeof 会产生一个无符号整数值。谢谢。
【解决方案2】:

使用宏更好

#include<stdio.h>
#define TOTAL_NO(X) (sizeof(X) / sizeof(X[0])) 


int array[10]={23,34,12,17,204,99,16};

int main()
{         


int d;
for(d = -1; d <= (int)TOTAL_NO(array); d++) {
 printf(" %d\n",array[d+1]);

}
return 0;

}

【讨论】:

    【解决方案3】:

    你应该知道sizeof返回size_t类型,而d是int类型,当你把它们放在一起时,d的类型会变成无符号,d会变成一个大数。如下代码:

    int a=-1;
    unsigned b=1;
    if(b>a)
        //something will never run
    

    【讨论】:

      猜你喜欢
      • 2022-07-28
      • 2015-05-16
      • 2016-12-12
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      相关资源
      最近更新 更多