〇、目录
一、简单变量
变量命名
在名称中只能使用字母、数字、下划线。
名称中第一个字符不能是数字。
不能用C++关键字作为名称。
以两个下划线或一个下划线和大写字母开头的名称被保留给实现(implementation)使用。以一个下划线开头的名称被保留用作全局标识符。
如果想用两个或更多的单词组成一个名称,通常的做法是用下划线将单词分开,如 my_onions;或者从第二个单词开始将每个单词的第一个字母大写,如 myEyeTooth。
整型
-
short, int, long, long long
short至少16位;
int至少与short一样长;
long至少32位,且至少与int一样长;
long long至少64位,且至少与long一样长。
-
无符号类型
unsigned short
unsigned
unsigned long
unsigned long long
-
char 类型
char
signed char unsigned char
wchar_t
char16_t
char32_t
-
bool 类型
头文件climits中包含了关于整型限制的信息:
#include <iostream>
#include <climits>
int main()
{
using namespace std;
int n_int = INT_MAX;
short n_short = SHRT_MAX;
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
cout << sizeof (int) << endl
<< sizeof n_short << endl
<< sizeof n_long << endl
<< sizeof n_llong << endl;
cout << n_int << endl
<< n_short << endl
<< n_long << endl
<< n_llong << endl;
return 0;
}
C++11的初始化方式:
int a = {5};
int a{5};
int a = {}; // set a to 0
int a{}; // set a to 0
整型字面值:
int a = 42; // 十进制
int b = 0x42; // 十六进制
int c = 042; // 八进制
//头文件iostream提供了提供了控制符dec, hex, oct,分别用于指示cout以十进制、十六进制和八进制格式显示整数。
cout << a << endl;
cout << hex;
cout << b << endl;
cout << oct;
cout << c << endl;
C++如何确定常量的类型:
-
suffixes
后缀 存储类型 L long U unsigned int UL unsighed long LL long long ULL unsigned long long -
size
对于不带后缀的十进制整数,将使用下面几种类型中能够存储该数的最小类型来表示:int, long, long long;
对于不带后缀的十六进制或八进制整数,将使用下面几种类型中能够存储该数的最小类型来表示:int, unsigned int, long, unsigned long, long long, unsigned long long.
转义字符:
有些字符不能直接通过键盘输入到程序中,有些字符也无法从键盘输入,C++提供了一种特殊的表示方法—转义序列。
通用字符名:
int k\u00F6rper;
cout << "Let them eat g\u00E2teau.\n";
wchar_t, char16_t, char32_t:
// wcout, wcin用于处理wchar_t流;前缀L指示宽字符常量和宽字符串
wchar_t bob = L'P';
wcout << L"tall" << endl;
//char16_t无符号,长16位,用前缀u表示
char16_t a = u'\u00F6';
char16_t b = u'q';
//char32_t无符号,长32位,用前缀U表示
char32_t a = U'\U0000222B';
char32_t b = u'q';
二、const 限定符
const type name = value;
const int MONTHS = 12;
三、浮点数
浮点数类型
float至少32bits;
double至少48bits,且不少于float;
long double至少和double一样多。
浮点常量
在默认情况下,像8.24和2.4E8这样的浮点常量都属于double类型。如果希望常量为float类型,请使用f或F后缀。对于long double类型,可使用l或L后缀。
浮点数的优缺点
- 浮点型的优点:表示非整数;表示的范围更大;
- 浮点型的缺点:运算速度慢,精度降低。
四、C++算术运算符
运算符优先级和结合性
- 算术运算符遵循通常的代数优先级,先乘除、后加减;
- 当两个运算符的优先级相同时,C++将看操作数的结合性是从左到右还是从右到左。从左到右的结合性意味着如果两个优先级相同的运算符被同时用于同一个操作数,则首先应用左侧的运算符。
除法运算符
如果两个操作数都是整数,则C++将执行整数除法,结果的小数部分将被丢弃。如果其中有一个(或两个)操作数是浮点值,则小数部分将保留,结果为浮点数。
类型转换
类型转换包括:
- 将一种类型的值赋给另一种类型的变量时,C++将对值进行转换;
- 表达式中包含不同的类型时,C++将对值进行转换;
- 将参数传递给函数时,C++将对值进行转换。
初始化和赋值时进行的转换
以{ }初始化时进行的转换(C++11)
以{}初始化时进行的转换时,要求比较严格,不允许变窄。
examples:
const int CODE = 66;
int x = 66;
char c1 {31325}; // narrowing, not allowed
char c2 {x}; // not allowed. x is not a constant
char c3 = x; // allowed
char c4 {CODE}; // allowed
表达式中的转换
-
整型提升(integral promotions)
在计算表达式时,C++将bool, char, unsigned char, signed char, short 值转换为int。
还有其他一些整型提升:如果short比int短,则unsigned short类型将被转换为int;如果两种类型的长度相同,则unsigned short类型将被转换为unsigned int。有符号整型按级别从高到低依次为long long、long、int、short 和 signed char。无符号整型的排列顺序与有符号整型相同。类型 char、signed char 和 unsigned char 的级别相同。类型 bool 的级别最低。wchar_t、char16_t 和 char32_t 的级别与其底层类型相同。
-
有些类型在与其他类型同时出现在表达式中时将被转换
C++11 版本的校验表:
(1) 如果有一个操作数的类型是 long double,则将另一个操作数转换为 long double。
(2) 否则,如果有一个操作数的类型是 double,则将另一个操作数转换为 double。
(3) 否则,如果有一个操作数的类型是 float,则将另一个操作数转换为 float。
(4) 否则,说明操作数都是整型,因此执行整型提升。
(5) 在这种情况下,如果两个操作数都是有符号或无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型。
(6) 如果一个操作数为有符号的,另一个操作数为无符号的,且无符号操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型。
(7) 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。
(8) 否则,将两个操作数都转换为有符号类型的无符号版本。
传递参数时的转换
强制类型转换
typeName (value)
强制类型转换运算符(第15章介绍)
C++11中的auto声明
处理复杂类型,如STL库中的类型时,自动类型推断的优势就能显现。例如:
std::vector<double> scores;
auto pv = scores.begin();
参考资料:C++ Primer Plus.