我已经初始化了一个值为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
。
请帮助我解决以下问题:
0
既不报告错误也不使用全局值? 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)
})
的值?
答案 0 :(得分:0)
我认为值0是因为编译器正在将其初始化为默认值
不。本地var
用作其自己的初始化程序。由于其值在初始化之前是不确定的,因此该程序的行为是不确定的。
- 为什么程序打印值为0,既不报告错误也不使用全局值?
行为是不确定的。
- i。 C是否像C ++一样具有范围解析运算符
::
?
否。
ii。如果否,那么我们如何使用同名的局部变量和全局变量?
C中没有等效的运算符。您不能在单个表达式中访问两个变量。