4. 布尔类型和引用
C++中的布尔类型
- C++在C语言的基本类型系统之上增加了
bool
- C++中的
bool
可取的值只要true
和false
- 理论上
bool
只占一个字节
注意:
true
代表真值,编译器内部用1
来表示
false
代表非真值,编译器内部用0
来表示
布尔类型的值
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);
#include <stdio.h>
int main(int argc, char **argv)
{
bool b = 0;
printf("b = %d\n", b);
b++;
printf("b = %d\n", b);
b = b - 3;
printf("b = %d\n", b);
return 0;
}
gun g++ 编译运行
注意: 此处编译使用 c++11 标准
编译:
g++ 4-1.cpp --std=c++11 -o 4-1.out
运行:
./4-1.out
b = 0
b = 1
b = 1
#include <stdio.h>
int main(int argc, char **argv)
{
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);
return 0;
}
gun g++ 编译运行
注意: 此处编译使用 c++11 标准
编译:
g++ 4-2.cpp --std=c++11 -o 4-2.out
运行:
./4-2.out
sizeof(b) = 1
b = 0, a = 0
b = 1, a = 1
b = 1, a = 1
a = 10, b = 1
a = 0, b = 0
布尔类型
- 布尔类型是C++的基本数据类型
- 可以定义 bool 类型的全局变量
- 可以定义 bool 类型的常量
- 可以定义 bool 类型的指针
- 可以定义 bool 类型的数组
- …
三目运算符
- C++对三目运算符进行了升级
下面的代码正确吗?
int a = 1;
int b = 2;
(a < b ? a : b) = 3;
printf("a = %d, b = %d\n", a, b);
#include <stdio.h>
int main(int argc, char **argv)
{
int a = 1;
int b = 2;
(a < b ? a : b) = 3;
printf("a = %d, b = %d\n", a, b);
return 0;
}
gun gcc 编译运行
编译:
gcc 4-3.c -o 4-3.out
4-3.c: In function ‘main’:
4-3.c:8:21: error: lvalue required as left operand of assignment
8 | (a < b ? a : b) = 3;
| ^
gun g++ 编译运行
编译:
g++ 4-3.c -o 4-3.out
运行:
./4-3.out
a = 3, b = 2
- C语言中的三目运算符返回的是变量值
- 不能作为左值使用
- C++中的三目运算符可以直接返回变量本身
- 既可作为右值使用,又可作为左值使用
注意:
三目运算符可能返回的值如果有一个是常量值,则不能作为左值使用。
#include <stdio.h>
int main(int argc, char **argv)
{
int a = 1;
int b = 2;
(a < b ? a : 2) = 3;
printf("a = %d, b = %d\n", a, b);
return 0;
}
gun g++ 编译运行
编译:
g++ 4-4.c -o 4-4.out
4-4.c: In function ‘int main(int, char**)’:
4-4.c:8:12: error: lvalue required as left operand of assignment
8 | (a < b ? a : 2) = 3;
| ~~~~~~~^~~~~~~~
思考:
C++对三目运算符做了怎么样的升级?这种升级的意义是什么?
C++中的引用
- 变量名回顾
- 变量是一段实际连续存储空间的别名
- 程序中通过变量来申请并命名存储空间
- 通过变量的名字可以使用存储空间
问题: 一段连续的存储空间只能有一个别名吗?
- 在C++中新增加了引用的概念
- 引用可以看作一个已定义变量的别名
- 引用的语法:
Type& name = var
;
int a = 4;
int& b = a; // b 为 a 的别名
b = 5; // 操作 b 就是操作 a
注意: 普通引用在定义时必须用同类型的变量进行初始化
#include <stdio.h>
int main(int argc, char *argv[])
{
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;
}
gun g++ 编译运行
编译:
g++ 4-5.c -o 4-5.out
运行:
./4-5.out
a = 5
b = 5
&a = 0x7fff61ce940c
&b = 0x7fff61ce940c
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++中的引用可以看作变量的别名来使用
- 三目运算符的可能返回都是变量时,返回的是引用