from http://www.learncpp.com/cpp-tutorial/13-a-first-look-at-variables/
变量
像x=5的语句是看上去是显而易见的。你可以猜测,我们将5赋值给x。但是x确切是什么呢?x是一个变量。
变量在C++中是一片内存的命名,它被用来存储信息。你可以把一个变量想象成一个邮箱,或是一个文件架,我们可以在那里存取信息。所有的计算机都具有内存,称为RAM(随机存取存储器),能够被程序使用。当一个变量被声明时,会分配出一段内存给这个变量。
在这一节,我们仅仅考虑整型变量。整型变量只能存储整型值,如1,2,3等。
1: int x;
当这个语句被CPU执行的时候,RAM中的一段内存将会被分配出来。对于这个例子,我们假设变量x的内存分配到的地址是140。无论什么时候,在表达式或语句,当程序看到这个变量x,它就知道改到地址为140的内存中去寻找这个值。
对于变量,一个最常见的操作是赋值。我们用赋值操作符实现该操作,=。当CPU执行一个语句,如x = 5;,它被解释为“将5放入地址为140的内存空间中。”
随后在我们的程序中,我们能够使用cout将x输出到屏幕。
1: cout << x;
在C++中,变量被理解为左值,左值就是一个在内存中拥有地址的值。由于所有的变量都具有地址,该地址能够接收数值,所有的变量都是左值。它们被命名为左值是因为它们能够出现在赋值语句的左边。当我们进行赋值时,赋值符号左边的值必须是左值,因此,像5 = 6;的语句会产生编译错误。5没有内存,或者说它的内存地址并没有被记录、命名,所以不能将值赋值给5。5就是5,它的值是不能被改变的。当一个左值有一个值赋值给它时,它将被重写。
与左值相对的就是右值,右值表示的任何能够赋值给左值的值。右值总是能够产生出一个独立的值。右值可以是,单个的数值,变量(表示最近一次被赋值的值),表达式(表达式求的的值)。
下面是一些赋值语句,显示右值是如何求值的:
1: int y; // declare y as an integer variable
2: y = 4; // 4 evaluates to 4, which is then assigned to y
3: y = 2 + 5; // 2 + 5 evaluates to 7, which is then assigned to y
4:
5: int x; // declare x as an integer variable
6: x = y; // y evaluates to 7, which is then assigned to x.
7: x = x; // x evaluates to 7, which is then assigned to x (useless!)
8: x = x + 1; // x + 1 evaluates to 8, which is then assigned to x.
有两处需要注意。第一,当每次程序运行时,并不能确保你的程序中的变量被赋上相同的内存地址。第一次运行你的程序时,x在内存中的地址是140,当第二次运行时,它在内存中的地址可能变成了168。第二,当一个变量被分配一个内存地址,这个变量在这个内存中是没有定义的。(换句话说,分配前那个内存中最后具有什么样的内后就是什么样的内容)。
这会导致危险的结果。思考一下下面的代码:
1: // #include "stdafx.h" // Uncomment if Visual Studio user
2: #include <iostream>
3:
4: int main()
5: {
6: using namespace std; // gives us access to cout and endl
7: int x; // declare an integer variable named x
8:
9: // print the value of x to the screen (dangerous, because x is uninitialized)
10: cout << x << endl;
11: }
在这个例子中,计算机会将没有被使用的内存分配给x。然后它会将原来属于那个内存地址的内容通过cout输出到屏幕。但是什么值将会被输出呢?谁晓得呢。你可以亲自试一试,看看会得到什么样的结果。举个例子,将这个程序用到Visual Studio旧版本的编译器时,输出-85899346.一些新的编译器,如Visual Studio 2005 Express,在运行这个程序时会出现调试错误信息。
没有被赋值的变量被称作未初始化变量。未初始化变量是很危险的,会导致断断续续的问题。(由于在每次执行程序的时候,未初始化的变量都可能会有不同的值)。这会导致程序很难被调试。现在的编译器大多能在编译时给出警告,如果你使用了没有初始化的变量。如果用Visual Studio 2005 Express调试上述的程序,会得到如下的警告:
c:\vc2005projects\test\test\test.cpp(11) : warning C4700: uninitialized local variable 'x' used
一个好的办法就是在 声明一个变量的时候就进行赋值,这将使得出错的程序在调试的时候变得简单。
有经验的编程人员通常会使用一个比较常见的技巧,就是给变量赋上有意义的范围外的初值。举个例子,如果我们有一个变量用来存储猫的个数,我们可以这么办:
1: int cat = -1;
-1是没有意义的,随后我们可以这么做:
1: cout << cat << "cat" << endl;
如果输出-1,就说明cat没有被正确的赋值。
建议:当你声明一个变量的时候总是赋一个值给这个变量。
cin
cin与cout相对,cout是将数据输出到控制台屏幕,cin是从控制台输入数据。现在已经理解了变量的几倍概念,我们可以使用cin来获取从控制台输入的数据,存储在变量中。
1: //#include "stdafx.h" // Uncomment this line if using Visual Studio
2: #include <iostream>
3:
4: int main()
5: {
6: using namespace std;
7: cout << "Enter a number: "; // ask user for a number
8: int x;
9: cin >> x; // read number from console and store it in x
10: cout << "You entered " << x << endl;
11: return 0;
12: }