在变量自己的声明中将变量赋值给自身

问题描述 投票:0回答:5
#include <stdio.h>
int main() {
    int c = c;
    printf("c is %i\n", c);
    return 0;
}

我正在定义一个名为

c
的整数变量,并将其值分配给自身。但这怎么能编译呢?
c
还没有初始化,那么如何给它自己赋值呢?当我运行该程序时,我得到
c is 0

我假设编译器正在生成为

c
变量分配空间的汇编代码(当编译器遇到
int c
语句时)。然后,它获取未初始化空间中的任何垃圾值并将其分配回
c
。这是怎么回事?

c variable-declaration
5个回答
30
投票

我记得在之前的回答中引用过这一点,但现在找不到。

C++03 §3.3.1/1:

名称的声明点紧接在其完整声明符(第 8 条)之后和其初始值设定项(如果有)之前,...

因此变量 c 即使在初始化部分之前也是可用的。

编辑:抱歉,您专门询问了有关C的问题;虽然我确信那里有一条等效的线。詹姆斯·麦克内利斯找到了它:

C99 §6.2.1/7:任何不是结构、联合或枚举标记的标识符“其范围在其声明符完成后开始”。声明符后面跟着初始化器。


11
投票

你的猜测完全正确。

int c
将变量的空间推入堆栈,然后从
c = c
部分读取并重写该变量(尽管编译器可能会对其进行优化)。您的编译器将值推为
0
,但不能保证始终如此。


5
投票

使用未初始化的值是未定义的行为(§C99 J.2“具有自动存储持续时间的对象的值在其被使用时被使用” 不确定”)。所以从鼻恶魔到c = 0,再到玩Nethack,任何事情都可能发生。


2
投票

c 已初始化!

虽然这是一行代码,但实际上是先初始化c,然后给c赋值。你很幸运,编译器正在为你将 c 初始化为零。


2
投票

C 规范不保证变量将被初始化为 0、0.0 或“”或“”。

这是编译器的一个功能,你永远不必强迫它会发生。

我总是将我的 IDE/编译器设置为对此发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.