为什么C++中没有初始化(然后使用)的int不会返回错误?

Oma*_*lla 4 c++ primitive-types

我是C++的新手(刚开始).我来自Java背景,我正在尝试下面的一段代码,将1和10之间的数字相加(包括),然后打印出总和:

/* 
 * File:   main.cpp
 * Author: omarestrella
 *
 * Created on June 7, 2010, 8:02 PM
 */

#include <cstdlib>
#include <iostream>

using namespace std;

int main() {
    int sum;

    for(int x = 1; x <= 10; x++) {
        sum += x;
    }

    cout << "The sum is: " << sum << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它总是打印32822.我知道答案应该是55并且意识到它打印最短值(32767)加上55.更改

int sum;
Run Code Online (Sandbox Code Playgroud)

int sum = 0;
Run Code Online (Sandbox Code Playgroud)

会工作(因为它应该,因为变量需要初始化!).但是为什么会出现这种情况呢?为什么编译器不会警告你这样的事情?我知道当没有初始化时,Java会尖叫你.

谢谢.

编辑:我正在使用g ++.这是g ++ --version的输出:我在Mac OS X上运行并使用g ++.

nom24837c:~ omarestrella$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 17

从未初始化的变量读取会导致未定义的行为,并且不需要编译器来诊断错误.

请注意,如果您尝试读取未初始化的变量,大多数现代编译器都会发出警告.使用gcc,您可以使用-Wuninitialized标志来启用该警告; 即使在警告级别1,Visual C++也会发出警告.

  • 这就是我总是用-Wall编译的原因. (11认同)
  • 是的,用g ++ -Wall是道理的方式! (3认同)

Ant*_*ony 13

因为它不是C++标准的一部分.变量只会占用当前所分配的内存中的任何值.这样可以节省有时不必要的操作,因为稍后会为变量分配值.

值得注意的是,Java/.Net程序员在切换到C/C++时需要注意并且非常重要.用C++编写的程序是本机和机器级的.它不是在VM或其他类型的框架上运行.它是原始操作的集合(大多数情况下).您没有在后台运行的虚拟机检查变量并为您捕获异常或段错误.这是一个很大的区别,它可能导致C++处理变量和内存的方式出现很多混乱,而不是Java或.Net语言.地狱,在.Net中,所有整数都被隐式初始化为0!


dmc*_*kee 5

考虑以下代码片段:

int x;

if ( some_complicated_condition ) {
   x = foo;
} else if ( another_condition ) {
   // ...
   if ( yet_another_condition ) x = bar;    
} else {
   return;
}

printf("%d\n",x);
Run Code Online (Sandbox Code Playgroud)

正在x使用的未初始化?你怎么知道的?如果代码有前提条件怎么办?

这些是自动回答的难题,并且执行初始化可能在某种程度上是低效的.


事实上,现代编译器可以很好地进行静态分析,并且通常可以判断变量是否或者可能未被初始化使用,并且在这种情况下它们通常会警告您(至少如果您将警告级别提高到足够高).但是c ++紧跟传统,期望程序员知道他或她在做什么.