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使用自己的(不确定)值进行初始化.
第二种情况就是你的问题.
它不是,它是未定义的行为.
你正在使用一个未初始化的变量 - x.你摆脱1了纯粹的运气,任何事情都可能发生.
仅供参考,在MSVS中,我收到警告:
警告1警告C4700:未初始化的本地变量'i'使用
此外,在运行时,我得到一个例外,所以它绝对不安全.
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++中是不可能的!前一个可以被解析但在语义上是错误的.第二个甚至无法解析.
| 归档时间: |
|
| 查看次数: |
3060 次 |
| 最近记录: |