【问题标题】:Why does this code print a garbage value?为什么这段代码打印一个垃圾值?
【发布时间】:2018-06-23 18:56:12
【问题描述】:

这段代码 sn-p 取自在线 C 编程测验。

https://www.youtube.com/watch?v=5sOZ7l2it2I

请帮助我理解这段代码。显然它打印了一个垃圾值。这里我们有一个局部变量 var,它隐藏了全局变量 var 的作用域。我假设局部变量 var 用全局变量 var 的值初始化,全局 var 的右值被复制到局部 var 中。我知道从那时起,代码中的名称 var 现在指的是本地 var。所以打印本地 var 也应该打印 5。但事实并非如此。程序打印一个垃圾值。这意味着本地 var 未初始化或在本地 var 初始化期间发生了某种错误。这里发生了什么?这是未定义行为的问题吗?

#include <stdio.h>
int var = 5;
int main() {
  int var = var;
  printf("%d", var);
}

【问题讨论】:

    标签: c scope initialization


    【解决方案1】:

    粗略地说,main 中的 int var = var;相当于

    int var; // this var is now in the current scope but is uninitialized
    var = var; // assign the garbage value from var to var.
    

    所以全局var 被忽略,而本地var 保持其垃圾值(因为它被分配给自己)。

    了解lexical scoping。检查 C11 标准 n1570(特别是其 §6.2.1)。

    顺便说一句,如果您询问所有警告和调试信息,一个足够好的编译器可能会警告您(所以 gcc -Wall -Wextra -gGCC;实际上它不适用于 Debian/Linux 上的 gcc 8 ...)。

    根据经验,最好为全局变量提供更长的描述性名称,并始终避免将局部(块范围)automatic variables 命名为全局或静态(文件范围)变量。

    关于undefined behavior,请阅读Lattner's blog 并成为UB 的scared

    【讨论】:

    • 那么var中的垃圾值是赋值给自己的吗?
    • @Galaxy 这一步可能会被编译器优化掉。
    • 没错。它已分配给自己!
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2013-09-04
    相关资源
    最近更新 更多