往期传送门:
《C++ Primer Plus 第六版 中文版》的研读与学习(十一)
《C++ Primer Plus 第六版 中文版》精选习题解析(一)
《C++ Primer Plus 第六版 中文版》的研读与学习(十)
《C++ Primer Plus 第六版 中文版》的研读与学习(九)
《C++ Primer Plus 第六版 中文版》的研读与学习(八)
《C++ Primer Plus 第六版 中文版》的研读与学习(七)
《C++ Primer Plus 第六版 中文版》的研读与学习(六)
《C++ Primer Plus 第六版 中文版》的研读与学习(五)
《C++ Primer Plus 第六版 中文版》的研读与学习(四)
《C++ Primer Plus 第六版 中文版》的研读与学习(三)
《C++ Primer Plus 第六版 中文版》的研读与学习(二)
《C++ Primer Plus 第六版 中文版》的研读与学习(一)
好久没有更新了,今天我们继续学习《C++ Primer Plus》
在上期内容中,我们讲了C++中整数数据的一些内容,今天,我们接着来谈谈整数型数据的有关知识。
我们先来看看这一段程序:
#include <iostream>
#include <climits>
#define ZERO 0 // 宏定义,使ZERO代表0值
using namespace std;
int main()
{
short sam = SHRT_MAX; // 初始化变量到最大值
unsigned short sue = sam; // 若变量sam已定义,即可如此
cout << "Sam has " << sam << " dollars and Sue has " << sue << " dollars deposited." << endl;
cout << "Add $1 to each account." << endl;
sam = sam + 1;
sue = sue + 1;
cout << "Now Sam has " << sam << " dollars and Sue has " << sue << " dollars deposited.\nPoor Sam!" << endl;
sam = ZERO;
sue = ZERO;
cout << "Take $1 to each account." << endl;
sam = sam - 1;
sue = sue - 1;
cout << "Now Sam has " << sam <<" dollars and Sue has " << sue << " dollars deposited." << endl << "Lucky Sue!" << endl;
return 0;
}
程序的运行结果:
Sam has 32767 dollars and Sue has 32767 dollars deposited.
Add $1 to each account.
Now Sam has -32768 dollars and Sue has 32768 dollars deposited.
Poor Sam!
Take $1 to each account.
Now Sam has -1 dollars and Sue has 65535 dollars deposited.
Lucky Sue!
首先,我们来看看这一条语句:
#define ZERO 0
在C++中,#define
与#include
一样,都是预处理器编译指令。语法:
#define macro-name replacement-string
该命令用于把指定的字符串替换文件中的宏名称 . 也就是说,#define
使编译器把文件中每一个macro-name替换为replacement-string. 替换的字符串结束于行末;另外一个功能是替换参数,使它假冒创建函数一样使用。注意:当使用复杂的宏时,最好使用额外的圆括号。
宏定义的命令与变量的初始化不同,宏定义之后不可修改。
接下来我们看这个程序主函数的内容。
程序定义了一个short
类型变量sam
和unsigned short
类型变量sue
,并对它们赋予short
类型的最大值32767,然后使两个变量分别加1。
我们发现,改变后的sue
值符合数学运算的结果,但是sam
却得到了-32768的值;同样,当sam
和sue
设置为0再减1后,sam
的值符合数学运算的结果,但是sue
却得到了65535的值。
究其原因,我们可以了解到,short
类型变量的取值范围是[-32768,32767];unsigned short
类型变量的取值范围是[0,65535]。这也就是无符号类型变量unsigned
与常规变量的区别。
通过设置无符号类型unsigned
的变量,我们可以避免C++发生上溢或下溢的错误。