【问题标题】:Question about variable definitions in functions关于函数中变量定义的问题
【发布时间】:2011-02-03 12:48:04
【问题描述】:

包括

main()
{
    int a;
    for(a=1; a<=4 && printf("%d ",a); a++)
    {
       int a;
       static int b=a;
       printf("%d ",(a++)-b);
    }  
    getchar();
    getchar(); 
}  

在这段代码中,打印输出是 1 0 2 1 3 2 4 3。我明白为什么 int a; part 的工作方式与在 for 函数之外定义的 int a 不同,为什么是 static int b;仅使用 a 的主值定义一次;但是为什么 printf 中的 (a++) 部分会影响 a 的后续值?我们不要重新定义 int a;每次 for 函数运行时?提前致谢。

【问题讨论】:

  • @all-editors: 当太多人同时编辑时不好;)
  • 这不是家庭作业。我为全国比赛学习 C 拼图。

标签: c variables integer for-loop definition


【解决方案1】:

内部的 a 是未定义的,因此编译器可以使用它喜欢的任何值。它喜欢的值显然是“a”占用的字节的当前值。第二次通过循环,你会得到一个全新的 inner-a,它恰好与之前的 inner-A 位于同一位置并假定它的值。

但这只是巧合——如果以其他方式更容易做到这一点,编译器会(并且合法地可以)。

还要注意,在第二个 a++ 之后永远不会读取 a 的值。如果你打开优化,编译器很可能会决定它不需要做那个增量,并且 a 的内部值总是为零。

【讨论】:

    【解决方案2】:

    您没有为内部a 赋值,因此结果未定义。

    即使您更改代码以将某些内容分配给a,您的代码也应该无法编译,因为您尝试将变量分配给此行上的本地静态:

    static int b=a;
    

    编译器输出:

    test.c: In function `main':
    test.c:9: error: initializer element is not constant
    

    【讨论】:

    • 哇,我什至没有意识到这在 C 中是无效的。即使您只使用 C 风格的编码,也要使用 C++ 的另一个理由。
    【解决方案3】:

    内部的“a”变量未初始化,因此每次循环时它的值在技术上都是未定义的。

    【讨论】:

    • 我知道它未初始化,但我看到在 printf 函数中 a 的未初始化值随着 a++ 的增加而增加。这是因为我的编译器还是 C++ 语言能够更改“未初始化”值?
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2011-05-10
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多