第4课 - 布尔类型和引用
第4课 - 布尔类型和引用
1. 布尔类型
(1)C++ 在 C 语言的基本类型系统之上增加了 bool 类型,其可取的值只有 true(编译器内部用1表示) 和 false(编译器内部用0表示)
(2)理论上 bool 只占用一个字节
(3)C++ 编译器会将非0值转换true(即1),0值转换为false(即0)
(4)bool 类型是基本类型,可以用来定义 bool 型的全局变量、常量、指针和数组等
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 bool b = false; // 使用false关键字进行初始化 6 int a = b; 7 8 printf("sizeof(b) = %d\n", sizeof(b)); // 1 9 printf("b = %d, a = %d\n", b, a); // 0 0 10 11 b = 3; 12 a = b; 13 14 printf("b = %d, a = %d\n", b, a); // 1 1 15 16 b = -5; 17 a = b; 18 19 printf("b = %d, a = %d\n", b, a); // 1 1 20 21 a = 10; 22 b = a; 23 24 printf("a = %d, b = %d\n", a, b); // 10 1 25 26 a = 0; 27 b = a; 28 29 printf("a = %d, b = %d\n", a, b); // 0 0 30 31 return 0; 32 }
输出结果: i = 1 , *p = 99 , i = 99
由这个结果可知,bool 类型本质上也是通过整型来实现的,使用了一个字节,获取 bool 类型变量的地址后通过指针依然可以修改 bool 变量的值。
bool 类型在赋值的时候编译器会进行判断,是为 true 还是 false ,然后存储为1 或 0。
使用 gdb 可以展现 C++ 中 bool 类型的本质,可以从存/取两个方面理解。
存:编译器根据给 bool 变量赋的值来决定存储到内存中的值是 True(1) 还是 False(0)
取:按照内存中存储的数据进行解析,像上面的例子,通过 char 指针改变 b 变量的值,后面 printf 打印 b 的值就为 100
2. 三目运算符的升级
(1)C 语言中的三目运算符返回的是变量的值,因值不能作为左值使用,只能当作右值。
(2)C++ 中的三目运算符
① 如果?后面的两个操作数有一个是常量,则行为与 C 语言的运算符一样,返回的是变量的值。
② 如果?后面的两个操作数都是变量,则返回变量的引用(相当于变量本身),如此,既可以作为右值,也可以作为左值使用。
3. C++ 中的引用
(1)变量名的回顾
① 变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间。
② 通过变量的名字可以使用存储空间。(变量的名字就是变量的值,&变量名是取地址操作)
问题:一段连续的存储空间只能有一个别名吗?
(2)C++中新增加了引用的概念
① 引用可以看作一个己定义变量的别名
② 引用的语法:Type& name = var; //Type为类型名,name为引用的名字,var为己定义的变量名
③ 普通引用在定义时必须用同类型的变量进行初始化,函数参数引用的初始化发生在函数被调用时。
1 #include <stdio.h> 2 3 int main() 4 { 5 int a = 4; 6 int& b = a; // b为a的别名 7 8 b = 5; // 操作b就是操作a 9 10 printf("a = %d\n", a); // 5 11 printf("b = %d\n", b); // 5 12 13 printf("&a = %p\n", &a); 14 printf("&b = %p\n", &b); // &b等于&a 15 16 // C++中的三目运算符 17 int m = 1; 18 int n = 2; 19 20 printf("m = %d, n = %d\n", m, n); 21 22 (m < n ? m : n) = 3; // ?后的m、n都是变量,返回的是引用, 23 // 将3赋值给一个变量的引用,是合法的 24 25 // (m < n ? m : 2) = 3; // ?后的操作数2为常量,将返回的是值, 26 // 从语义看,要将3赋值给2,是非法的 27 28 printf("m = %d, n = %d\n", m, n); 29 30 return 0; 31 }
4. 小结
(1)bool 类型是C++中新添加的基础类型,其值只能是 true 或 false
(2)C++中的三目运算符可作为左值使用
(3)C++中的引用可以看作变量的别名来使用
(4)三目运算符的可能返回都是变量时,返回的是引用
注:本文总结于狄泰唐老师的《C++深度解析》课程
狄泰QQ群:199546072
本人QQ号:502218614