【发布时间】:2019-09-28 10:40:15
【问题描述】:
我尝试了这些代码行并发现了令人震惊的输出。我期待一些与初始化相关的原因,无论是在一般情况下还是在 for 循环中。
1.)
int i = 0;
for(i++; i++; i++){
if(i>10) break;
}
printf("%d",i);
输出 - 12
2.)
int i;
for(i++; i++; i++){
if(i>10) break;
}
printf("%d",i);
输出 - 1
我希望语句“int i = 0”和“int i”是相同的。它们之间有什么区别?
【问题讨论】:
-
第二个代码可以输出任何东西,因为
i是未初始化的 -
“它们之间的差异”正是您的代码所显示的:一个被初始化为确定的值,另一个不是。后者的完整代码因此调用未定义的行为。
-
现在您必须记住,C 和 C++ 是两种非常不同的语言,具有非常不同的语义。您提供的代码是这种差异真正重要的一种情况。在一种语言中,它立即是未定义的行为。
-
static int i;在 C 中将i初始化为零(edit);可能也在 C++ 中,但不要相信我的话。 -
@Someprogrammerdude -- 整数可以有一个陷阱值。 C11 标准中 6.2.6.2/3 的最后一段说,对于符号大小和二进制补码表示,符号位 1 和值位全 0 可以是陷阱表示,而对于补码,一个符号位 1 和值位全 1 可以是陷阱表示。此类值是普通值还是陷阱表示是由实现定义的。