C++ Primer Plus Note Chapter3

C++ Primer Plus 学习笔记

第三章

变量命名
  • 名称中只能使用字母字符、数字和下划线_
  • 名称的第个字符不能是数字
  • 区分大写字符与小写字符
  • 不能将C++关键字用作名称
  • 两个下划线打头或以下划线和大写字母打头的名称被保留给现实(编译器及其使用的资源)使用。以一个下划线开头的名称被保留给现实,用作全局标识符。
  • C++对于名称的长度没有限制,名称中所有的字符都有意义但有些平台有长度的限制

变量的命名尽量遵循某种规范

整型
名称 说明
short 至少16位
int 至少与short一样长
long 至少32位,且至少与int一样长
long long C++11新增,至少64位,且至与long一样长

可以使用运算符sizeof来观察变量的长度。头文件climits中包含了关于整性限制的信息。如INT_MAXint的最大值、CHAR_BIT是字符的位数、LLONG_MAXlong long的最大值。

unsigned可以创建整型的无符号版本,这会使变量无法表示负数,从而能表示更大的正整数

和C相同,C++的八进制数在第一位使用0,十六进制数是在前两位使用0x

为了让输出的数以其他进制表示,可以使用cout << hexcout << oct,前提是已经输入了省略编译指令using namespace std,否则需要输入std::hex或者std::oct.

char类型主要用于储存ASCII字符,或者小整数,范围是-128~127。
书中例程提供了一种新的显示字符的方式:使用成员函数cout.put()
像这样cout.put('s'),效果和cout << 's'一致

C++中的转义序列和C一样。

C++支持通用字符名的表示,它通过\u后面加上8个十六进制数或者\U后面加上16个十六进制数来表示。这个应该使用来表示Unicode的。另外,C++还提供了wchar_tchar16_t以及char32_t这几种字符类型来满足各类需求。

const限定符

常量的定义推荐使用const,而不是像C那样使用#define
格式如下,const type name = value
常量的命名一般将首字母大写或者以k开头。

浮点数
名称 说明
float 至少32位,通常为32位
double 至少48位,且至少和float一样长,通常为64位
long double 至少和double一样长,通常为80、96或128位

相关的系统限制在头文件float中。

C++和C一样提供了两种表示浮点数的方法:标准小数点表示和E表示。
cout在输出浮点数是会删除结尾的零,可以调用下面这行语句来覆盖掉这一行为,cout.setf(ios_base::fixed, ios_base::floatfield);

默认情况下,C++会把浮点常量认为是double型,如果希望常量为float型可以使用fF作为后缀。
若希望常量为long double型,可以使用lL作为后缀。

同时,浮点型的计算会比整型更慢,且精度更低。

算术运算符
符号 说明
+ 对操作数执行加法运算
- 从第一个数减去第二个数
* 将操作数相乘
/ 用第一个数除以第二个数
% 用第一个数除以第二个数产生的余数,要求两个数都是整型

优先级遵循代数优先级,先乘除后加减。
当出现形如120/4*5这类情况时,优先级遵从从左至右。
当出现形如20*5+24*6这类情况时,两个*的优先级由系统决定,但显然这种情况优先级的不同不会引起结果的改变。

类型转换

C++会自动执行以下类型的转换

  • 将一种算术类型的值赋给另一种算数类型的变量时
  • 表达式中包含不同类型的变量时
  • 将参数传递给函数时

初始化和赋值进行的转换,形如:

long so_long;
short thirty=5;

so_long = thirty;

需注意这种转换在将值赋给范围更大的类型时不会出现问题,但如果是缩小转换就可能会出现一些问题。

使用{}进行列表初始化,形如

const int code=66;
int x = 66;

char c1 {
     31325};    // 越界,不被允许
char c2 = {
     66};
char c3 {
     code};
char c4 = {
     x};  // 因为x不是一个常数,故不被允许
x = 31325;
char c5 = x; // 这种形式是被允许的

可见列表初始化会比第一种赋值初始化更加严格,它不支持缩小转换。

整型提升
在表达式中,C++自动将bool、char、unsigned char、signed char和short值转换为int

在表达式中进行的转换,编译器会依次查验以下校验表:

  1. 如果有一个操作数类型是long double,则将另一个操作数转为long double
  2. 否则,如果一个操作数类型是double,则将另一个操作数转为double
  3. 否则,如果一个操作数类型是float,则将另一个操作数转为float
  4. 否则,说明操作数都是整型,因此执行整型提升。
  5. 这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一低,则转为更高的级别。
  6. 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
  7. 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属类型。
  8. 将两个操作数都转换为有符号类型的无符号版本。

虽然感觉C++11已经尽可能地避免表达式中类型转换导致的运算错误,但感觉不同类型的值在一起运算仍然有可能导致错误,应该尽量避免这种情况。

强制转换,形如

(long)thorn
long(thorn)
static_cast<long>(thorn)

你可能感兴趣的:(C++学习,c++)