常量和变量

在程序运行中,其值不能被改变的量称为常量。常量区分为不同的类型,如34、0、-4为整型常量,4.3、-1.32为实型常量,'a'、'b'为字符常量。

一般定义方法如下:

    const int a=34;
    const float b=10.01;

在程序运行中,其值可以改变的量称为变量,一个变量应该有一个名字,即标识符。

C++规定标识符只能由字母、数字、美元符和下划线等字符组成,且第一个字符必须为字母或下划线或美元符。

下面列出的是合法的标识符,也是合法的变量名:

    _sum,average,Day,school_name,lotus_1_2,PASCAL,$sum

下面是不合法的标识符和变量名:

    Mr.Wang,234NUM,#34,a>=b,¥1234

C++语言是区分大小写字母的,所以,SUM和sum是两个不同的变量名。

在选择变量名和其他标识符时,应注意做到“见名知意”,即选有含义的英文单词(或其缩写)作标识符,如count、total、price等。尽量少用代数符号(如a、b、c、x1、y1)作变量名,以增加程序的可读性。

下面是一个试图改变常量的错误代码:

1 //试图改变常量a的错误的程序
2 #include <iostream>
3 using namespace std;
4 
5 int main()
6 {
7  const int a=34;           //定义了一个int型的常量a,a等于34
8  a=a*5;     //试图将a乘以5后再将其值赋给a
9  cout<<a<<endl;
10 system("pause");
11 return 0;
12 }

const是C++程序里的关键字,表示所定义的类型为常量,我们可以看到,程序的第8行试图改变常量a的值。由于常量是不能够被改变的,所以程序在编译时将会出现如下错误:

assignment of read-only variable 'a'

另一种定义方法是用一个标识符代表一个常量,如下面的代码:

1 //标识符定义常量
2 #include <iostream>
3 #define PRICE 34           //定义了一个符号常量
4 using namespace std;
5 
6 int main()
7 {
8  int number=10;
9  int total;
10  total=number*PRICE;
11  cout<<"total="<<total<<endl;
12  system("pause");
13  return 0;
14 }

程序中用#define定义PRICE这个标识符代表常量34,此后凡是在本源文件中出现的PRICE都代表34。用这种方法、用户能以一个简单的名字代替一个长的字符串。标识符一般用大写字母表示,可以和常量一样进行运算。本程序运行结果为total =340。

使用符号变量的好处是含义清楚,在需要改变一个常量时能做到“一改全改”。假设该程序中多处用到了某物品的价格,如遇到价格调整,只需改动本程序的第3行即可,如#define PRICE 100。

注意:定义符号变量语句末尾无分号。

整数常量称为整常量,除正常十进制表示方法外,整常量的特殊表示方法如下:

一个整常量后面加一个字母U或u,认为是unsigned int型,如1234u,在内存中按unsigned int规定的方式存放。

一个整常量后面加一个字母L或l,则认为是long int型常量。例如1234l、432L等。

一个整常量以数字0开头的数是八进制数。例如0234表示八进制数234,即(234)8,其值为2×82+3×81+4×80,等于十进制数156;-011表示八进制数-11,即十进制数-9。

一个整常量以0x开头的数是十六进制数。如0x123,代表十六进制数123,即(123)=1×162+2×161+3×160=291;-0x12等于十进制-18。

实数又称浮点数。实数有两种表示方法:

(1)十进制小数形式,它由数字和小数点组成。如.234、1234.、1234.0、0.0。

(2)指数形式。如234e3或234E3都代表234×103。注意字母e(或E)之前必须有数字,且e后面的指数必须为整数。

由于实数在内存中的存放是用有限的存储单元存储的,所以能提供的有效数字总是有限的,在有效位以外的数字将会被舍去。由此可能会产生一些误差。

下面的程序演示浮点数的舍入误差:

1 //浮点数舍入误差演示
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7  float a,b,c;
8  a=2345678900.000;          //定义一个很大的浮点数
9  b=3; //定义一个很小的浮点数
10  cout<<a<<endl;
11  c=a+b;
12  cout<<c<<endl;
13  system("pause");
14  return 0;
15 }

运行结果如图1.19所示。

图1.19

这是由于float类型的变量只能保证7位有效数字,后面的数字是无意义的,并不能准确地表示该数。例如定义float f=123456.111;当运行cout<<f语句输出f时,结果为123456。如果将f改为double型,则能全部接收上述数字并存储在变量f中。

所以在使用实型数据时一定要格外注意实型数据的舍入误差。没有特别需要,尽可能少用实型数据。以免产生不必要的误差而影响结果的正确性。

另外,应避免将一个很大的浮点数和一个很小的数直接相加或相减,这样会“丢失”小的数。