在初始化中使用新声明的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)增加。
注意,它仍然不是很理智或有用的代码。
你的代码有两个可能性:
- 如果
x
是一个局部variables,则由于您在生命周期开始之前使用对象的值,所以您有未定义的行为。 - 如果
x
具有静态或线程本地生存期,则将其初始化为零,并且您的静态初始化将可靠地将其设置为1
。 这是明确的。
您也可以阅读我的答案,涵盖相关案例,包括其他types的variables,以及在初始化完成之前写入的variables
3.3.1声明的要点1除了下面指出的内容之外,声明的名称紧接其完整的声明符(第8节)之后,在其初始化符之前(如果有的话)。 [例如:int x = 12; {int x = x; }这里第二个x是用自己的(不确定的)值初始化的。 – 例子]
上述状态如此,应该有不确定的价值,你是幸运的1。
这是未定义的行为,编译器至less应该发出警告。 尝试编译使用g++ -ansi ...
第二个例子只是一个语法错误。