【问题标题】:Why doesn't my C program print the array values? [duplicate]为什么我的 C 程序不打印数组值? [复制]
【发布时间】:2011-07-04 03:42:44
【问题描述】:

可能重复:
A riddle (in 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;
 }

【问题讨论】:

    标签: c


    【解决方案1】:

    问题是,TOTAL_ELEMENTS 是一个无符号值,在您尝试使用的实现上,它可能是 unsigned long int。比较将尝试将d-1 的整数值提升为unsigned long,这将导致类似于 0xFFFFFFFFFFFFFFFF 并且大于 7-2=5(TOTAL_ELEMENTS-2 的结果);因此,循环条件被评估为假,并且永远不会执行主体。如果您从比较运算符的右侧显式丢弃unsigned,它应该可以正常工作:

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

    (顺便说一下,COUNTOF宏一般定义为:

    #define COUNTOF(x) ((sizeof((x))/sizeof(*(x)))
    

    COUNTOF(array) 一样使用,而不是为每个数组定义一个宏。但是,这不是您看到问题的原因;您的宏在这里被正确使用。这与问题完全正交,只是一个编码风格建议。)

    【讨论】:

    • 你能解释更多关于有符号和无符号值的比较是如何完成的,或者建议我任何链接吗?我想知道当我们进行这样的比较时会发生什么……
    • @bornfree:除了你的问题附录:编译器会给你一个警告,同时说:有符号/无符号不匹配。警告很重要
    • @Aamir:不,它没有发出任何警告……顺便说一下,我正在使用 gcc 编译器。
    • @bornfree 本帖详细介绍了转换过程:stackoverflow.com/questions/50605/…
    • @R.. 当然。这不是一个真正的“修复”。这是签名问题的直观证明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多