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++也会发出警告.
Ant*_*ony 13
因为它不是C++标准的一部分.变量只会占用当前所分配的内存中的任何值.这样可以节省有时不必要的操作,因为稍后会为变量分配值.
值得注意的是,Java/.Net程序员在切换到C/C++时需要注意并且非常重要.用C++编写的程序是本机和机器级的.它不是在VM或其他类型的框架上运行.它是原始操作的集合(大多数情况下).您没有在后台运行的虚拟机检查变量并为您捕获异常或段错误.这是一个很大的区别,它可能导致C++处理变量和内存的方式出现很多混乱,而不是Java或.Net语言.地狱,在.Net中,所有整数都被隐式初始化为0!
考虑以下代码片段:
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 ++紧跟传统,期望程序员知道他或她在做什么.