Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未赋值变量值_C++_Variables - Fatal编程技术网

C++ 未赋值变量值

C++ 未赋值变量值,c++,variables,C++,Variables,当我使用代码时: #include <iostream> using namespace std; int main() { while(1) { int a; if(a != 0) { cout << a << endl; break; } } return 0; } #包括 使用名称空间std; int main() { 而(1

当我使用代码时:

#include <iostream>

using namespace std;

int main()
{

    while(1) {
        int a;
        if(a != 0) {
            cout << a << endl;
            break;
        }
    }

    return 0;
}
#包括
使用名称空间std;
int main()
{
而(1){
INTA;
如果(a!=0){

cout这取决于编译器和选项。形式上,您有一个不确定的值。但是g++编译器倾向于将这些变量设置为0

考虑机器代码级别上发生的情况,如果执行第一次通过声明时
a
为0,则程序中没有任何东西可以合理地导致该内存位置中的值发生更改,因此会得到一个无限循环


然而,在源代码级别,使用该不确定值(包括仅检查它)会导致形式上的未定义行为,在这种情况下,任何事情或任何事情都可能发生,包括预期会发生的事情。:)

读取未初始化的变量是“未定义的行为”——意思是“任何事情都有可能发生,编译器可以随心所欲地执行任何操作”(不仅仅是对所讨论的变量,实际上是对整个程序)


不要在你的程序中调用未定义的行为。或者遭受(不可预测的)后果结果。

当您不给变量赋值,然后引用它时,程序的行为不会被定义为该值可能是该内存位置上的任何垃圾。在您的情况下,幸运的是,它总是为零。如果您更改操作系统/编译器/编译器选项,甚至更改正在进行的操作n在操作系统中,你很可能会得到不同的结果。

未分配的变量表现出未定义的行为。UB就是UB。你不能期望
a
是任何东西。它只是随机的。它甚至可以在你的机器上重现,但这并不意味着它总是这样。更改优化标志、编译器或体系结构r无论如何,可能会给你不同的结果。在这个简单的例子中,它可能是0 as(至少对于Windows)你可以从零页池中获得新的mem页,这样你就不能“窥探”其他进程释放的页并可能获得安全的数据——但正如其他进程所说的那样,不要依赖于此。只要你分配/释放内存并重用自己进程中的前一个内存(stdlib也可以这样做)您将在未初始化的数据中看到“垃圾”未初始化的值会导致未定义(不可预测)的行为;因此“不允许”"例如,读取同一个未初始化变量可以返回不同的值。我只是意识到我在愚弄自己。我实际上使用G++编译器。哦……我的…GNU C++编译器是G+。通常,在我的经验中,如果没有初始化,将局部变量设置为零。但是我没有读到任何保证,以及其他编译器。一般来说,谢谢。但是我想问哪个编译器没有设置ub值?我知道它们一般比g++@ SLLOMI快得多:我认为大多数编译器在缺省情况下都不会清除本地变量。例如VisualC++没有。虽然:)但我想我明白你的意思。非常感谢。我以前没有读过这个答案,但现在它向我解释了很多。我问了我父亲同样的问题,你也像他一样回答。我明白UB非常危险,必须避免。