《C++学习笔记》-- 4. 布尔类型和引用

4. 布尔类型和引用

学习资源

C++中的布尔类型

  • C++在C语言的基本类型系统之上增加了 bool
  • C++中的 bool 可取的值只要 truefalse
  • 理论上 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);

4-1.cpp

#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

4-2.cpp

#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);

4-3.c

#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++中的三目运算符可以直接返回变量本身
    • 既可作为右值使用,又可作为左值使用

注意:

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

4-4.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++中的引用

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

4-reference_01.png

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

  • 在C++中新增加了引用的概念
    • 引用可以看作一个已定义变量的别名
    • 引用的语法: Type& name = var;
int a = 4;
int& b = a; // b 为 a 的别名
b = 5;      // 操作 b 就是操作 a

注意: 普通引用在定义时必须用同类型的变量进行初始化

4-5.cpp

#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 类型的值只能是 truefalse
  • C++中的三目运算符可以作为左值使用
  • C++中的引用可以看作变量的别名来使用
  • 三目运算符的可能返回都是变量时,返回的是引用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值