第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 }
bool类型的使用

    输出结果 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 }
C++的引用

4. 小结

  (1)bool 类型是C++中新添加的基础类型,其值只能是 true false

  (2)C++中的三目运算符可作为左值使用

  (3)C++中的引用可以看作变量的别名来使用

  (4)三目运算符的可能返回都是变量时返回的是引用

 

注:本文总结于狄泰唐老师的《C++深度解析》课程

狄泰QQ群:199546072

本人QQ号:502218614

posted @ 2017-07-05 09:17  Hengs  阅读(443)  评论(0编辑  收藏  举报