这段代码定义了两个同名变量,为什么还能编译?

问题描述 投票:0回答:1

我遇到了这个问题。问题是:这段代码会编译成功还是会返回错误?

#include <stdio.h>

int main(void)
{
    int first = 10;
    int second = 20;
    int third = 30;

    {
        int third = second - first;
        printf("%d\n", third);
    }
    printf("%d\n", third);
    return 0;
}

我个人认为这段代码应该会给出错误,因为我们在主函数中重新初始化变量

third
,而这个问题的答案是这段代码将成功运行并输出 10 和 30。

然后我在 VS Code 上编译了这段代码,它给出了一个错误,但在一些在线编译器上它运行成功,没有错误,有人可以解释一下吗?

我认为

main
内的大括号内不能有两个同名的变量。如果
third
在大括号之后初始化,而不是在它之前初始化,它将完全正常工作。像这样:

#include <stdio.h>

int main(void)
{
    int first = 10;
    int second = 20;

    {
        int third = second - first;
        printf("%d\n", third);
    }
    int third = 30;
    printf("%d\n", third);
    return 0;
}
c scope
1个回答
1
投票

您发布的程序正在定义以下 4 个不同的

int
变量:

  1. 名为
    first
    的变量。
  2. 名为
    second
    的变量。
  3. 外部
    scope
    中名为third的变量。
  4. 内部作用域中名为
    third
    的变量。

变量 #3 和 #4 是不同的,尽管这两个变量具有相同的名称。当在内部作用域中使用标识符

third
时,您指的是变量#4。当在外部作用域中使用该标识符时,您引用的是变量#3。

我认为 main 内的大括号内不能有两个同名的变量。

可以,而且确实有。这不是好的编程风格,但语言允许你这样做。

我个人认为这段代码应该会报错

如果您希望编译器在一个变量的名称遮盖另一个变量的名称时发出警告,那么,使用编译器 gcc 和 clang,您可以使用

-Wshadow
命令行选项进行编译。

然后我在 vs code 上编译这段代码,它给出了一个错误

由于您发布的代码是有效的 C 代码,因此它不应该给出错误消息,而可能只给出警告消息(除非您告诉编译器您希望将警告视为错误)。

那么我们如何访问这些大括号内的变量

您无法直接从内部作用域访问外部作用域中的变量。但是,您仍然可以通过指针从内部作用域间接访问该变量:

#include <stdio.h>

int main(void)
{
    int first = 10;
    int second = 20;
    int third = 30;
    int *p = &third;

    {
        int third = second - first;
        printf("%d\n", third);
        printf("%d\n", *p );
    }
    printf("%d\n", third);
    return 0;
}

这将打印:

10
30
30
© www.soinside.com 2019 - 2024. All rights reserved.