c - 嵌套范围变量的异常行为

标签 c gcc scope

<分区>

我熟悉 C 中的嵌套作用域规则,其中嵌套 block 内的相同变量名称会遮盖具有相同名称的外部变量。 但是对于以下代码片段,我无法确定输出的解释。

#include <stdio.h>
int main()
{
    int x = 1, y = 2, z = 3;
    printf(" x = %d, y = %d, z = %d \n", x, y, z);
    {
        int x = 10;
        float y = 20;

        printf(" x = %d, y = %f, z = %d \n", x, y, z);
    }

    {
        int z = 100;
        printf(" x = %d, y = %f, z = %d \n", x, y, z);
    }

    return 0;
}

以上片段的输出是:

x = 1, y = 2, z = 3

x = 10, y = 20.000000, z = 3

x = 1, y = 20.000000, z = 2

谁能帮我理解第三个 printf 语句中 y 的值如何产生超出范围的变量值。

首先我认为它可能是垃圾值,因为使用 %f 打印整数会导致垃圾值,因此将内部范围内的 y 的值更改为其他值结果与输出值相同,因此我确认它不是垃圾值。

我已经使用 gcc version 6.3.1 20161221 (Red Hat 6.3.1-1) (GCC) 编译了程序,也使用了各种在线编译器编译了程序。

最佳答案

你有一个未定义的行为:

{
    int z = 100;
    printf(" x = %d, y = %f, z = %d \n", x, y, z); // here y is an int
}

如果您在 printf() 中的标志与正确的类型不匹配,这是未定义的行为。

您必须使用 %d 标志。

{
    int z = 100;
    printf(" x = %d, y = %d, z = %d \n", x, y, z); // here y is an int
}

关于c - 嵌套范围变量的异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44541680/

相关文章:

c - 是否可以使用 for 循环索引访问结构元素?

c - libgcov fork 和 exec 钩子(Hook)

javascript - 无法在 Javascript 中访问另一个对象内的不同对象,它给出 ReferenceError : abc is not defined

c - 在 C 中读取/proc/cpuinfo 并打印匹配行

c++ - 为什么我的模板需要 C++ 链接?

gcc - 如何分析编译器警告的 make 输出?

javascript - Ng-click 不起作用

c++ - 内存分配器范围的设计

c - 如何在 C 中调用具有完整 IO 的外部程序

c++ - ubuntu linux 上的 opengl - 链接器错误 : undefined references