为什么编译器在返回未初始化的变量时不给出错误?

Why doesn't the compiler give an error when an uninitialized variable is returned?

本文关键字:出错 错误 变量 编译器 返回 初始化 为什么      更新时间:2023-10-16
#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的本地变量,您可以跳过它们的初始化,但这会产生未定义的行为。真的不依赖它。

相关文章: