1.3 变量的了解(和cin)——入门

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: }
posted @ 2012-04-14 09:46  grassofsky  阅读(473)  评论(0编辑  收藏  举报