含自赋值的C语言声明可编译?合规性与变量值定义疑问
关于这段C语言代码的编译与值定义问题
先看你给出的代码:
int foo() { int x = x; return x; }
1. 代码是否被标准保证可编译?
是,这段代码符合C语言语法规则,标准保证它可以通过编译。
在C语言的作用域规则中,变量x的作用域从其声明点开始。执行int x = x;时,等号右侧的x已经处于自身作用域内,编译器能识别该标识符,不会抛出“未声明标识符”的错误。这种写法虽不符合编码规范,但完全符合语法要求,因此标准允许编译器通过编译。
2. 赋值完成后变量x的值是否有明确定义?
没有,这属于未定义行为,标准不对x的最终值做任何保证。
你在GCC中得到0只是该编译器的特定实现行为,并非C标准要求。原因是:int x = x;的赋值操作里,右侧的x尚未完成初始化——函数内的局部非静态变量属于自动变量,未显式初始化时初始值不确定。访问这类未初始化变量属于未定义行为,标准允许编译器产生任意结果,可能是0、随机垃圾值,甚至触发异常行为,不同编译器、不同编译模式(如调试/Release)下结果都可能不同。
内容的提问来源于stack exchange,提问作者Jeff G
相关产品推荐
相关产品推荐

