将全局变量重新声明为局部变量时的程序输出

时间:2019-01-29 18:12:31

标签: c++ c

我已经初始化了一个值为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 var的输出为5

请帮助我解决以下问题:

  1. 为什么程序打印值0既不报告错误也不使用全局值?
  2. i。 C是否像C ++一样具有范围解析运算符::

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

    iii。如何使用gdb检查全局var和本地import java.io.File val d = new File("/home/loom/shp") val dirList = d.listFiles.filter(_.isDirectory).toList dirList.map({ _.listFiles.filter(f => f.isFile).filter(f => f.getName.endsWith("shp")).toList.map(println) // !! Inducde an error // _.listFiles.filter((f => f.isFile) && (f => f.getName.endsWith("shp"))).toList.map(println) }) 的值?

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

1 个答案:

答案 0 :(得分:0)

  

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

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

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

行为是不确定的。

  
      
  1. i。 C是否像C ++一样具有范围解析运算符::
  2.   

否。

  

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

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