在初始化中使用新声明的variables(int x = x + 1)?

我偶然发现了一个让我感到惊讶的行为:

写作时:

int x = x+1; 

在一个C / C ++程序(甚至更复杂的expression式涉及新创build的variablesx)我的gcc / g ++编译没有错误。 在上面的情况中,X是1之后。 请注意,以前的声明中没有variablesx的范围。

所以我想知道这是否是正确的行为(甚至可能在某些情况下是有用的),或者只是一个parsing器与我的gcc版本或gcc一般。

顺便说一句:以下不起作用:

 int x++; 

用expression式:

 int x = x + 1; 

variablesx=号处出现,这就是为什么你可以在右边使用它。 通过“成立”,我的意思是variables存在,但还没有被初始化部分赋值。

然而,除非你使用静态存储持续时间初始化一个variables(例如,在函数之外),否则它是未定义的行为,因为存在的x有一个任意的值。

C ++ 03有这样的说法:

声明的名称是在其完整的声明符(第8条)之后,并且在其初始化符(如果有的话)之前。

例:
int x = 12;
{ int x = x; }
这里第二个x是用自己的(不确定的)值初始化的。

第二种情况几乎和你的问题一样。

不是,这是不确定的行为

您正在使用一个未初始化的variables – x 。 你得到纯粹的运气,任何事情都可能发生。

仅供参考,在MSVS中,我收到警告:

警告1警告C4700:使用了未初始化的本地variables“i”

另外,在运行时,我得到一个exception,所以它绝对不安全。

 int x = x + 1; 

基本上是

 int x; x = x + 1; 

你很幸运有0 x

 int x++; 

但是在C ++中,在parsing器级别是不可能的! 以前可以parsing,但语义错误。 第二个甚至不能被parsing。

在第一种情况下,只需使用已存在于variables所在的内存中的值。 在你的情况下,这似乎是零,但它可以是任何东西。 使用这样的结构是灾难性的,难以在将来发现错误。

对于第二种情况,这只是一个语法错误。 你不能混合一个expression式和这样的variables声明。

variables是从“=”开始定义的,所以它是有效的,当它被全局定义时,它被初始化为零,所以在这种情况下是定义的行为,而在其他情况下,variables是未被初始化的,因为它仍然是单位化的但随着1)增加。
注意,它仍然不是很理智或有用的代码。

你的代码有两个可能性:

  1. 如果x是一个局部variables,则由于您在生命周期开始之前使用对象的值,所以您有未定义的行为。
  2. 如果x具有静态或线程本地生存期,则将其初始化为零,并且您的静态初始化将可靠地将其设置为1 。 这是明确的。

您也可以阅读我的答案,涵盖相关案例,包括其他types的variables,以及在初始化完成之前写入的variables

3.3.1声明的要点1除了下面指出的内容之外,声明的名称紧接其完整的声明符(第8节)之后,在其初始化符之前(如果有的话)。 [例如:int x = 12; {int x = x; }这里第二个x是用自己的(不确定的)值初始化的。 – 例子]

上述状态如此,应该有不确定的价值,你是幸运的1。

这是未定义的行为,编译器至less应该发出警告。 尝试编译使用g++ -ansi ... 第二个例子只是一个语法错误。