1、C++中的布尔类型
— C++在C语言的基本类型系统之上增加了 bool
— C++中的 bool 可取的值只有 true 和 false
— 理论上 bool 只占一个字节
注意:
true 代表真值,编译器内部用 1 来表示
false 代表非真值,编译器内部用 0 来表示
2、布尔类型的值
- bool 类型只有true(非0)和 false(0)两个值
- C++编译器会将非0值转换成 true,0值转换成 false
下面的代码输出什么?
bool b = 0;
printf("b = %d\n", b);
b++;
printf("b = %d\n", b);
b = b - 3;
printf("b = %d\n", b);
虽然说从概念上C++确实提供了 bool 类型具体的对应的基础类型,但是它的内部实现还是用一个字节的整型,所以为了兼容C语言,bool 类型是支持数学运算的,只不过C++编译器在内部会进行一些调整,当 bool 类型进行数学运算,它得到的值是一个非0值,C++编译器直接将这个非0值直接转换成 true,0值转换成 false
#include <stdio.h>
int main()
{
bool b = false;
int a = b;
printf("sizeof(b) = %d\n", sizeof(b)); //1
printf("b = %d,a = %d\n", b, a); //0,0
b = 3;
a = b;
printf("b = %d,a = %d\n", b, a); //1,1
b = -5;
a = b;
printf("b = %d,a = %d\n", b, a); //1,1,
a = 10;
b = a;
printf("a = %d,b = %d\n", a, b); //10,1
a = 0;
b = a;
printf("a = %d,b = %d\n", a, b); //0,0
return 0;
}
从这个程序我们可以看出,对布尔类型赋值一个非0的数,它会在内部立刻转换成true,也就是数字1。
- 布尔类型是C++中的基本数据类型
— 可以定义bool类型的全局变量
— 可以定义bool类型的常量
— 可以定义bool类型的指针
— 可以定义bool类型的数组
— …
3、三目运算符
- C++对三目运算符进行了升级
下面的代码正确吗?
int a = 1;
int b = 2;
(a < b ? a : b )= 3;
printf("a = %d,b = %d\n", a, b);
如果在这里修改一下代码,变成
int a = 1;
int b = 2;
(a < b ? a : 2 )= 3;
printf("a = %d,b = %d\n", a, b);
为什么会有这样的差别呢?
- C语言的三目运算符返回的是变量值
— 不能作为左值使用 - C++中的三目运算符可直接返回变量本身
— 既可以作为左值使用,又可以作为右值使用
注意:
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
4、C++中的引用
- 在C++中新增加了引用的概念
— 引用可以看做一个已定义变量的别名
— 引用的用法:Type& name = var;
int a = 4;
int& b = a; //b为a的别名,b和a有相同的类型,都为int
b = 5; //操作b就是操作a
引用在定义的时候必须要进行初始化
#include <stdio.h>
int main()
{
int a = 4;
int& b = a;
b = 5;
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("&a = %p\n", &a);
printf("&b = %p\n", &b);
return 0;
}
错误用法:
int a = 4;
float& b = a; //类型错误
float&b; //没有初始化
int& a = 1; //不能是常量的别名
- C++对三目运算符做了什么?
— 当三目运算符的可能返回都是变量时,返回的是变量引用
— 当三目运算符的可能返回有常量时,返回的是值
int a = 1;
int b = 2;
(a < b ? a : b )= 3; //正确,返回的是a或b的引用,可作为左值
(a < b ? 1 : b )= 4; //错误,返回1或b的值,不能作为左值
小结:
- bool类型是C++新增加的基础类型
- bool类型的值只能是true或false
- C++中的三目运算符可作为左值来使用
- C++中的引用可以看做变量的别名来使用
- 三目运算符的 可能返回 都是变量时,返回的是引用