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

Ans*_*mpe 9 c c++ initialization undefined-behavior

我偶然发现了令我惊讶的行为:

写作时:

int x = x+1;
Run Code Online (Sandbox Code Playgroud)

在C/C++程序中(或者涉及新创建的变量x的更复杂的表达式),我的gcc/g ++编译没有错误.在上述情况下,X之后为1.请注意,前一个声明的范围中没有变量x.

所以我想知道这是否是正确的行为(甚至可能在某些情况下有用)或者只是我的gcc版本或gcc的解析器pecularity.

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

int x++;
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 18

用表达式:

int x = x + 1;
Run Code Online (Sandbox Code Playgroud)

变量x=符号处出现,这就是为什么你可以在右边使用它.通过"存在",我的意思是变量存在但尚未被初始化部分赋值.

但是,除非您使用静态存储持续时间(例如,在函数之外)初始化变量,否则它是未定义的行为,因为它的x存在具有任意值.

C++ 03有这个说法:

名称的声明点紧跟在其完整的声明者(第8条)之后和其初始化者(如果有的话)之前......

示例:
int x = 12;
{ int x = x; }
此处第二个x使用自己的(不确定)值进行初始化.

第二种情况就是你的问题.


Luc*_*ore 8

它不是,它是未定义的行为.

你正在使用一个未初始化的变量 - x.你摆脱1了纯粹的运气,任何事情都可能发生.

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

警告1警告C4700:未初始化的本地变量'i'使用

此外,在运行时,我得到一个例外,所以它绝对不安全.


Sha*_*baz 5

int x = x + 1;
Run Code Online (Sandbox Code Playgroud)

基本上是

int x;
x = x + 1;
Run Code Online (Sandbox Code Playgroud)

你很幸运能有0英寸x.

int x++;
Run Code Online (Sandbox Code Playgroud)

但是在解析器级别的C++中是不可能的!前一个可以被解析但在语义上是错误的.第二个甚至无法解析.