CPP-02-数据处理

简单变量

1
2
int num;
num = 5;

程序将找到一块能够存储整数的内存,将该内存单元标记为num,并将5复制到该内存单元中;然后,可在程序中使用num来访问该内存单元

C++还有另一种C语言没有的初始化语法

1
int num(5);

这些变量都是声明了类型了,计算机如何知道没有声明类型的常量,比如

1
cout << "Year = " << 1492 << "\n";

除非有理由存储为其他类型,否则 C++ 将整型常量存储为 int 类型,这里的其他理由是指

  • 使用了特殊的后缀来表示特定的类型
  • 太大,不能存储为 int

const

首先来看 #define 符号常量–预处理方式

1
#define INT_MAX 32767

在C++编译过程中,首先将源代码传递给预处理器。在这里,#define#include一样,是一个预处理器编译指令。告诉预处理器:在程序中查找INT_MAX,并将所有的 INT_MAX都替换为32767

const#define 好。

  1. const 能够明确指定类型。
  2. 可以使用C++的作用域规则将定义限制在特定的函数或文件中
  3. 可以将const用于更复杂的类型,比如数组或者结构

d.dddE+n指的是将小数点向右移n位

d.dddE~n指的是将小数点向左移n位,8.33E~4 表示8.33/10^4,即0.000833

类型转换

转换 潜在的问题
将较大的浮点类型转换为娇小的浮点类型,如将 double 转换为 float 精度(有效数位)降低,值可能超出目标类型的 取值范围,在这种情况下,结果将是不确定的
将浮点类型转换为整型 小数部分丢失,原来的值可能超出目标类型的取 值范围,在这种情况下,结果将是不确定的
将较大的整型转换为较小的整 型,如将long转换为short 原来的值可能超出目标类型的取值范围,通常只 复制右边的字节

将 0 赋给bool变量时,将被转换为false;而非零值将被转换为true

C++11制定了校验关系

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

也可以{ }方式初始化时进行的转换

1
2
3
int ch(77);
int cm = {78};
cout << ch << " "<< cm; //77 78

强制类型转换不会修改变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值,常见的转换表达式如下

1
2
(typeName) var
typeName (var)

C++还引入了4个强制类型转换运算符

1
2
3
4
5
6
int ch(77);
char cm = (char)ch;
bool flag = bool(ch);
bool cf = static_cast<bool>(ch);

cout << ch << " "<< cm << " " << flag << " " << cf; //77 M 1 1

auto

C++11新增了一个工具,让编译器能够根据初始值的类型推断变量的类型。为此,它重新定义了auto的含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;

template<typename T>
string type_name() {
string name = typeid(T).name();
return name;
}

int main() {
int num = 42;
double pi = 3.14159;
char letter = 'A';
bool is_true = true;
auto name = 1e6+7;

cout << "Type of num: " << type_name<decltype(num)>() << endl;
cout << "Type of pi: " << type_name<decltype(pi)>() << endl;
cout << "Type of letter: " << type_name<decltype(letter)>() << endl;
cout << "Type of is_true: " << type_name<decltype(is_true)>() << endl;
cout << "Type of name: " << type_name<decltype(name)>() << endl;

return 0;
}

输出结果

1
2
3
4
5
Type of num: i
Type of pi: d
Type of letter: c
Type of is_true: b
Type of name: d

总结

C++的基本类型分为两组:

  1. 由存储为整数的值组成,整型之间通过存储值时使用的内存量及有无符号来区分,从最小到最大依次是:boolcharsigned charunsigned charshortunsigned shortintunsigned intlongunsigned long以及

  2. 由存储为浮点格式的值组成。分别是floatdoublelong double

C11新增了long longunsigned long long,还有一种wchar_t 类型,它在这个序列中的位置取决于实现。C11新增了类型char16_tchar32_t,分别存储16和32位的字符编码

参考链接

  1. 《C++ Primer Plus》