You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言变量自初始化的预期输出?关于int abc = abc;的执行疑问

关于int abc = abc;的行为分析和预期输出

兄弟,我来给你把这个问题讲明白——你写的int abc = abc;其实是C语言里典型的未定义行为,根本不存在什么“自初始化的作用”,先把这个核心点拎清楚。

为什么你的编译器输出0?

当你执行int abc = abc;时,右边的abc是还没完成初始化的变量(毕竟左边的abc正在被创建),按照C语言标准,这时候它的值是完全不确定的。但很多现代编译器(比如GCC、Clang)会对这种明显有问题的代码做“兜底处理”,默认把它设为0——这只是编译器的善意优化,不是标准规定的必然结果。要是换个编译器,或者开高警告、关闭优化选项,输出可能变成随机的垃圾值,甚至程序直接崩溃,都有可能。

为什么“打印地址”的说法完全错误?

你用的格式说明符是%d,它的唯一作用就是打印十进制整数数值,和变量的地址没有任何关系。要打印变量的地址,必须用%p格式符,同时还要把变量的地址传进去(比如写printf("%p", &abc);)。那个不可信来源的说法完全是混淆了变量的值和地址,纯纯的误导,不用搭理它。

关于C语言变量初始化的正确规则

给你梳理下关键规则:

  • 局部变量(比如函数内部定义的abc)如果没有显式初始化,它的值是未确定的(不是0,不是地址,就是内存里遗留的垃圾数据);
  • 全局变量或者静态局部变量会被编译器默认初始化为0;
  • 但你这种“用未初始化的变量自身来初始化”的写法,属于标准明确规定的未定义行为——也就是说,C标准不保证任何结果,编译器想怎么处理都行,没有所谓的“预期输出”。

总结一下:你的编译器输出0只是它的一种处理方式,不是什么“自初始化”的效果,更不可能打印地址。这种写法本身就是错误的,永远不要这么写。

内容的提问来源于stack exchange,提问作者user13775517

火山引擎 最新活动