【问题标题】:C Program - About Sizeof and Constant Used TogetherC 程序 - 关于 Sizeof 和 Constant 一起使用
【发布时间】:2017-01-18 18:41:00
【问题描述】:

以下是我遇到问题的代码。我了解常量,并相信我了解 sizeof 函数,但一定会遗漏一些东西。这是我试图自己解决的问题: - printf 声明 TOTAL_ELEMENTS 作为 %d - 它返回 7 - printf TOTAL_ELEMENTS 的语句 - 2 - 它返回 5(如预期的那样) - 在 for 循环中替换 5 - 循环正确运行 - 初始化任何名称的全局 int 变量并将其设置为等于(sizeof(array) / sizeof(array[0]))。然后在 TOTAL_ELEMENTS 所在的 for 循环中使用变量 - 循环再次正确运行。

所以(至少在我的脑海中),它必须是涉及常量和 sizeof 函数的东西 - 我很肯定数组/数组 [0] 也起作用,但通过测试和替换我不能找出问题所在。我已经阅读了 sizeof 函数以及常量,但无济于事。我尝试过搜索,但没有找到任何地方,因为我不完全确定我在搜索什么。我不一定需要答案,但如果有人能指出我正确的方向,我将不胜感激。提前谢谢你。

#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;
}

【问题讨论】:

  • 可能是我使用的编译器;它应该显示数组的所有元素,但是当我尝试运行它时发生的所有事情都是它运行并以没有打印输出结束。
  • 好的;我将代码复制到 ideone.com 到 C 编译器/执行器中,它也没有输出。但是,当我更改原始描述中列出的代码时,它会按预期工作;仍然不确定。
  • 我得到相同的结果...没有输出。获得预期输出的唯一方法是分配int dmax = (TOTAL_ELEMENTS-2); 并将循环更改为for(d=-1;d &lt;= dmax;d++)

标签: c arrays constants sizeof


【解决方案1】:

此问题与sizeof 无关。这是因为比较有符号和无符号值。在您的代码中,(TOTAL_ELEMENTS-2) 有一个无符号值,但 d 是一个有符号变量。因此,for 条件会将 5 与 0xFFFFFFFF 进行比较,并且 5 小于 0xFFFFFFFF 那么它总是错误的! 例如:

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

    return 0;
}

它不打印任何东西! ,与您的代码相同。

【讨论】:

  • 您可以通过在循环 for(d=-1;d &lt;= (int)(TOTAL_ELEMENTS-2);d++) 中强制转换为 int 来强制进行签名比较。
  • 谢谢大家!这是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多