C语言中的布尔类型

C语言中没有布尔类型

C++中的布尔类型

  • C++在C语言的基础类型系统里增加了bool
  • C++中的bool可取的值只有true和false
  • 理论上bool只占用了一个字节

注意:

  • true代表真值,编译器内部用1来表示
  • false代表非真值,编译器内部用0来表示

C++的两个加号,一个加号就是类型上面的增强,另一个加号就是面向对象的加强 所以C语言中没有的布尔类型,在C++中就提供了这种bool类型

布尔类型的值

  • bool类型只有true(非0)和false(0)两个值
  • C++编译器会将非0值转换为true,0值转换为false
//下面的代码会输出什么?
bool b = 0;
printf("b = %d",b);//0

b++;
printf("b = %d",b);//1

b = b - 3;
printf("b = %d",b);//1

但是C++中的布尔类型的内部实现还是用一个字节(byte)的整型来实现的。

#include <stdio.h>

int main()
{
    bool b = false;
    int a = b;

    printf("sizeof(b) = %d\n", sizeof(b));//1
    printf("b = %d, a = %d", b, a);//0,0

    b = 3;
    a = b;

    printf("b = %d, a = %d", b, a);//1,1

    b = -5;
    a = b;

    printf("b = %d, a = %d", b, a);//1,1

    a = 10;
    b = a;

    printf("a = %d, b = %d", a, b);//10,1

    a = 0;
    b = a;

    printf("a = %d, b = %d", a, b);//0,0

    return 0;
}

布尔类型

布尔类型是C++中的基本数据类型

  • 可以定义bool类型的全局变量
  • 可以定义bool类型的常量
  • 可以定义bool类型的指针
  • 可以定义bool类型的数组
  • 其他基本类型能干的事情,bool类型都能干

三目运算符

C++对三目运算符进行了升级

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;

    (a < b ? a : b) = 3;//等价于a = 3;

    printf("a = %d, b = %d\n", a, b);
}

C语言中的三目运算符返回的是变量值

  • 不能作为左值使用

C++中的三目运算符返回的是变量本身(注意是变量本身)

  • 既可以作为右值使用,又可以作为左值使用

牢记:

  • 三目运算符就只有在所有的可能返回都是变量的时候才能作为左值使用
  • 如果混搭,编译器就会报错,像如下:
    int a = 1;
    int b = 2;

    (a < b ? a : 2) = 3;//这句就会报错

注意:

  • 三目运算符可能返回的值中如果有一个常量值,则不能作为左值使用

C++中的引用

变量名回顾

  • 变量是一段实际连续存储空间的别名
  • 程序是通过变量来申请并命名存储空间
  • 通过变量的名字可以使用存储空间

问题:一段连续的存储空间只能有一个别名吗?答案:不一定

###在C++中新增加了引用的概念

  • 引用可以看做是一个已定义变量的别名
  • 引用的语法:Type& name = var;
    int a = 4;
    int& b = a;//b为a的别名

    b = 5; //操作b就是操作a

注意:

  • 普通引用在定义时必须用同类型的变量进行初始化。初始化一定是其他同类型(一定要同类型,不然编译器报错)变量的别名,不能用字面常量进行初始化(不然编译器报错)
#include <stdio.h>

int main()
{
    int a = 4;
    int& b = a;

    printf("a = %d\n", a);
    printf("b = %d\n", b);//a、b值一样
    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);//a、b地址也一样
}

C++对三目运算符做了什么

  • 当三目运算符的可能返回都是变量时,返回的就是变量引用
  • 当三目运算府的可能返回中有常量时,返回的是值
int a = 1;
int b = 2;

(a < b ? a : b) = 3;//正确,返回 a 或 b 的引用,可作为左值
(a < b ? a : b) = 4;//错误,返回 1 或 b 的值,不能作为左值 

小结

  • bool类型是C++新增加的基础类型
  • bool类型的值只能是true和false
  • C++中的三目运算符可作为左值使用
  • C++中的引用可以看做是变量的别名来使用
  • 三目运算符的可能返回都是变量时,返回的是引用