为什么编译器在返回未初始化的变量时不给出错误?
Why doesn't the compiler give an error when an uninitialized variable is returned?
#include <iostream>
using namespace std;
int weirdVariable = weirdVariable + 1;
int main() {
cout<< weirdVariable ;
return weirdVariable ;
}
我只是想知道这个非定位变量是如何返回错误并返回1.所以我的问题是,它是如何/为什么返回值" 1"的问题。该程序在逻辑上有效吗?还是有些缺陷?
它不是不可原始化的。具有静态存储持续时间(如全局变量)的变量首先在任何进一步的初始化之前对零定位化。因此weirdVariable
最终以值1。
§3.6.2[basic.start.init] 带有静态存储持续时间(3.7.1)的变量(3.7.1)或线程存储持续时间(3.7.2)应在任何之前进行零置(8.5)发生了其他初始化。
如果要将wierdVariable
声明为 main
局部,则它将是不可原始化的。这将为您提供不确定的行为,因为在非直接化对象上执行lvalue到rvalue转换(读:使用)提供了不确定的行为。
§4.1[cons.lval] 如果glvalue引用的对象是[...]非专业化的,一个程序 这需要这种转换具有不确定的行为。
静态变量默认为0,因此它是完全正常的
C标准ISO/IEC 9899:1999 A.K.A. C99(和C )标准说必须是这样。有关确切文本(https://stackoverflow.com/a/1294780/1938163),请参见WG14 N1256第6.7.8节中的项目10("初始化")
顺便说一句:初始化静态变量是一个好练习,也只是为了使代码更可读!
static int myvar = 0;
不初始化它们的另一个缺点:如果编译器不遵循标准,您可能会遇到麻烦
关于不是 static和不是 global的本地变量,您可以跳过它们的初始化,但这会产生未定义的行为。真的不依赖它。
相关文章:
- 分段错误当我试图运行程序时出错
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 安装 mply 库时出错.致命错误:gsl/gsl_sf.h:没有这样的文件或目录
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 编译特征程序时出错:错误:'seq'不是'Eigen'的成员
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 编译类 C++ 中的线程时出错(错误 xthread)
- 加载GLEW库时出错(错误LNK2001)
- 通过函数指针调用函数时出错(错误C2064)
- 编译core.obj时出错:错误LNK2001:未解析的外部符号_harmony_core_init
- 链接c++静态库与android ndk时出错(错误:无法识别文件格式)
- 使用GCC编译游戏时出错.(错误:将"Screen"的含义从"class Screen&q