首页 > 解决方案 > 程序的输出,当全局变量被重新声明为局部变量时

问题描述

我已经初始化了一个值为 5 的全局变量,然后初始化了一个同名的局部变量。

当我使用 gcc 编译器执行以下代码时

//Code 1
#include<stdio.h>

int var = 5;
int main()
{
  int var = var;
  printf("%d",var);
}

输出为 0

如果我修改代码如下并用gcc编译,

//Code 2
#include<stdio.h>

int var = 5;
int main()
{
  int v = var;
  printf("%d %d",v, var);
}

输出为 5 5

如果我修改代码如下并用g++编译,

//Code 3 
#include<stdio.h>

int var = 5;
int main()
{
  int var = var;
  printf("%d %d",var, ::var);
}

输出为 0 5

我认为值 0 是因为编译器将其初始化为默认值(https://stackoverflow.com/a/1597491

我尝试使用 gcc -g Code_1 并在输出二进制文件上运行 gdb,并在

第 4 行(int var = 5;)

第 7 行(int var = var;)

第 8 行(printf("%d",var);)

但是在运行程序时,执行在第 8 行停止,并print var输出$1 = 0. 当我跳出代码0x00007ffff7e07223 in __libc_start_main () from /usr/lib/libc.so.6时,输​​出print var5.

请帮助我解决以下问题:

  1. 为什么程序打印值0,既不报错,也不使用全局值?

  2. 一世。C 是否具有范围解析运算符::,例如 C++?

    ii. 如果不是,那么我们如何使用同名的局部和全局变量?

    iii. 如何var使用 gdb 检查 global 和 local 的值?

  3. 为什么 gdb 在 main() 之前没有遇到断点?

标签: c

解决方案


我认为值 0 是因为编译器将其初始化为默认值

不,本地var被用作它自己的初始化程序。由于它的值在初始化之前是不确定的,因此程序的行为是不确定的。

  1. 为什么程序打印值0,既不报错,也不使用全局值?

行为未定义。

  1. 一世。C 是否具有范围解析运算符::,例如 C++?

不。

ii. 如果不是,那么我们如何使用同名的局部和全局变量?

C 中没有等效的运算符。您不能在一个表达式中访问这两个变量。


推荐阅读