为什么我得到 C 程序的垃圾值
Why am I getting garbage value for the C program?
如果我使用 GCC/Clang 编译以下 C 代码,为什么我会得到垃圾值?请注意,如果我只是在内部范围内打印 x 的值,我会得到预期的结果。
#include<stdio.h>
int main()
{
int x = 5;
{
int x = x;
printf("%d", x);
}
return 0;
}
在此声明中
int x = x;
标识符x
的声明点是在声明器的完整定义之后,该声明符x
在赋值符号之前已经可见=
并隐藏在外部块作用域中声明的具有相同名称的变量。
并且您有未初始化的x
分配给自身。因此,它具有不确定的值。
你可以这样想象
int x;
x = x;
C++标准中存在完全相同的示例(3.3.2 声明点(
1 名称的声明点紧随其后 完整的声明符(第 8 条(及其初始值设定项(如果有(之前, 除非下文另有说明。[ 示例:
int x = 12;
{ int x = x; }
在这里,第二个 x 使用它自己的(不确定(值进行初始化。 —结束示例 ]
在C标准中有书面的(6.2.1标识符的范围(
7 结构、联合和枚举标记的作用域仅以 在声明 标记。每个枚举常量的作用域紧随其后 其定义枚举器在枚举器列表中的外观。任何 其他标识符的作用域在完成 它的声明符。
注意枚举器的定义。枚举器的规则是不同的。
该程序格式良好,枚举器x
将由在外部作用域中声明的变量x
初始化(而枚举器y
将由前面的枚举器x
初始化(。
#include <iostream>
int main()
{
const int x = 10;
{
enum E { x = x + 1, y = x };
std::cout << "E::x = " << x << ", E::y = " << y << std::endl;
}
std::cout << "x = " << x << std::endl;
}
程序输出为
E::x = 11, E::y = 11
x = 10
声明
int x = 5;
超出了第二个块的范围。这意味着变量x
在以下代码段中
{
int x = x;
printf("%d", x);
}
不同于外部变量x
,在main中声明。因此,当您尝试在赋值中访问其值时,它会给出一个垃圾值,因为它之前在此范围内不存在,因此未初始化。
相关文章:
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 为什么异常不退出程序?
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 尽管我的功能和cout语句的放置错误,但我的程序为什么会起作用
- C++简单的程序 - 为什么我的"res"不进入我的向量?创建一个接受输入 (4+44-67+235) 并输出结果的程序
- 额外的反斜杠字符不会影响我的程序.为什么
- linux C/C++套接字程序为什么没有出现ECONNRESET错误
- C++程序.为什么这段代码有效
- C++迭代程序-为什么我必须添加.begin()才能获得二进制搜索的中点
- 迭代程序.为什么要使用它们