C++ 这两段代码有何不同?

C++ 这两段代码有何不同?,c++,c,loops,for-loop,C++,C,Loops,For Loop,我尝试了这些代码行,发现了令人震惊的输出。我期待着一些与初始化有关的原因,无论是在一般情况下还是在for循环中 一, 产出-12 二, 产出-1 我希望语句int I=0和int I是相同的。它们之间的区别是什么?区别是您已经观察到的。第一个代码初始化i,另一个不初始化。使用一个单位化的值是C++中未定义的行为UB。编译器假定UB不会发生在正确的程序中,因此允许发出执行任何操作的代码。 更简单的例子是: int i; i++; 编译器知道i++不能发生在正确的程序中,并且编译器不会为错误的输入

我尝试了这些代码行,发现了令人震惊的输出。我期待着一些与初始化有关的原因,无论是在一般情况下还是在for循环中

一,

产出-12

二,

产出-1


我希望语句int I=0和int I是相同的。它们之间的区别是什么?

区别是您已经观察到的。第一个代码初始化i,另一个不初始化。使用一个单位化的值是C++中未定义的行为UB。编译器假定UB不会发生在正确的程序中,因此允许发出执行任何操作的代码。 更简单的例子是:

int i;
i++;
编译器知道i++不能发生在正确的程序中,并且编译器不会为错误的输入发出正确的输出,当您运行此代码时,任何事情都可能发生

欲了解更多信息,请参阅此处:

这是一条经验法则,除其他外,它有助于避免未初始化的变量。它被称为几乎总是自动,它建议几乎总是使用自动。如果你写信

auto i = 0;
您不能忘记初始化i,因为auto需要一个初始化器来推断类型

的问题。 我希望语句int I=0和int I是相同的

不,你的期望是错误的。如果在函数外部将变量声明为全局变量,或者使用static关键字声明,则即使不将write=0,也保证将其初始化为0。但是在函数中定义的变量没有静态的普通局部变量不能保证初始化。如果您没有显式地初始化它们,那么它们首先包含不确定的值

但请注意,在这种情况下,不确定并不意味着随机。如果您编写一个使用或打印未初始化变量的程序,通常您会发现每次运行程序时,它都包含相同的值。碰巧,它甚至可能是0。在大多数机器上,所发生的情况是,变量接受上一个调用的函数在堆栈上留下的任何值

另见这些相关问题:

另请参见和中的

另请参见中的

附录:根据您的评论,听起来好像当您未能初始化i时,它恰好以0开头的不确定值,因此您现在的问题是:

给定程序

#include <stdio.h>
int main()
{
    int i;                   // note uninitialized
    printf("%d\n", i);       // prints 0
    for(i++; i++; i++){
        if(i>10)    break;
    }
    printf("%d\n", i);       // prints 1
}

但那没有任何意义!,你说。编译器如何转向i++;i++;i++。。。进入i++?答案是——你听过,但也许你还不太相信——当程序包含未定义的行为时,编译器可以做任何事情。

第二个代码可以输出任何东西,因为我是统一的。它们之间的区别正是你的代码所显示的:一个被初始化为确定的值,另一个则不是。后者的完整代码会调用未定义的行为。现在,你必须记住C和C++是两种非常不同的语言,它们的语义非常不同。您提供的代码就是这种差异真正重要的一种情况。在一种语言中,它立即是未定义的行为;在C中将i初始化为零编辑;可能也在C++中,但不要相信我的话。@某个程序员-整数可以有陷阱值。C11标准中6.2.6.2/3的最后一段指出,对于符号幅度和两个补码表示,值位的符号位1和所有0可以是陷阱表示,对于一个补码,值位的符号位1和所有1可以是陷阱表示。它的实现定义了这样一个值是正常值还是陷阱表示。即使没有初始化,它也会打印0,第二种情况的结果是1。我想知道这背后的原因。@KavishMadaan我不知道你说的打印0是什么意思,即使它没有初始化-我以为你说它打印了1。但无论如何,如果我碰巧开始包含-1,程序将打印1。@KavishMadaan我现在有点不明白你在问什么。我想问题是为什么这两个项目不同?我希望我们已经回答了。如果你现在问第一个程序如何打印1?,答案是如果我一开始是-1。或者您想知道-1的初始值如何导致它打印1?如果我将print语句作为printf%d放在for循环之前,那么案例1的输出是-0 12,案例2的输出是-0 1有两种可能性。我将在两个单独的评论中讨论这些问题。但是在这之前,我必须说:我们可能不会搞清楚这一点,我们可能不会找到一个满足你的答案。在C和C++中,在我的例子中,int变量被初始化为0。我也通过在声明后打印值进行了检查 变量,它打印0。我的问题是为什么对于相同的i值有两种不同的输出。@KavishMadaan printf%d,i;在我未初始化时可以打印任何内容,0只是您可以观察到的许多可能结果中的一个
auto i = 0;
#include <stdio.h>
int main()
{
    int i;                   // note uninitialized
    printf("%d\n", i);       // prints 0
    for(i++; i++; i++){
        if(i>10)    break;
    }
    printf("%d\n", i);       // prints 1
}
#include <stdio.h>
int main()
{
    int i;                   // note uninitialized
    printf("%d\n", i);       // prints 0
    i++;
    printf("%d\n", i);       // prints 1
}