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
.
请帮助我解决以下问题:
为什么程序打印值
0
,既不报错,也不使用全局值?一世。C 是否具有范围解析运算符
::
,例如 C++?ii. 如果不是,那么我们如何使用同名的局部和全局变量?
iii. 如何
var
使用 gdb 检查 global 和 local 的值?为什么 gdb 在 main() 之前没有遇到断点?
解决方案
我认为值 0 是因为编译器将其初始化为默认值
不,本地var
被用作它自己的初始化程序。由于它的值在初始化之前是不确定的,因此程序的行为是不确定的。
- 为什么程序打印值0,既不报错,也不使用全局值?
行为未定义。
- 一世。C 是否具有范围解析运算符
::
,例如 C++?
不。
ii. 如果不是,那么我们如何使用同名的局部和全局变量?
C 中没有等效的运算符。您不能在一个表达式中访问这两个变量。
推荐阅读
- google-cloud-platform - 是否可以在 GCP/stackdriver 中创建基于日志的累积指标?
- github - Github Actions 无法写入文件,权限被拒绝(在 docker 容器内)
- flutter - 在 Flutter 中设置父 Widget 的状态
- ios - WatchOS 动态通知不适用于 Xcode 11.1 及更高版本 - 未调用 didReceive
- three.js - THREE.js - TypeError: url.search 不是一个函数。(在 'url.search( /\.jpe?g($|\?)/i )' 中,'url.search' 未定义)
- sql-server - SQL Server XML 查询嵌套节点
- excel - 行字段中没有层次结构的数据透视表设计
- boot - PXE 引导 Arch 字段 DHCP 选项 93
- automation - 为什么我的伺服电机 SG90 不会停止旋转?
- linux - 检查文件是否存在。`~/ 之间有什么区别
` 和 `/home/user/ `