C++笔记 第四课 进化后的const分析---狄泰学院

版权声明:原创·禁止转载 https://blog.csdn.net/weixin_42187898/article/details/83152703

如果在阅读过程中发现有错误,望评论指正,希望大家一起学习,一起进步。
学习C++编译环境:Linux

第四课 布尔类型和引用

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
下面的代码输出什么?0,1,1 0(false), 1(true), -2(true)

bool b = 0;
printf(“b = %d\n”, b);
b ++;
printf(“b = %d\n”, b);
b = b - 3;
printf(“b = %d\n”, b);

4-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);  //  0, 0
    
    return 0;
}
运行结果:
lkk@lkk-virtual-machine:~/c++$ g++ 4-1.cpp
4-1.cpp: In function ‘int main(int, char**)’:
4-1.cpp:8:41: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
     printf("sizeof(b) = %d\n", sizeof(b));
                                 ^
lkk@lkk-virtual-machine:~/c++$ ./a.out
sizeof(b) = 1
b = 0, a = 0
b = 1, a = 1
b = 1, a = 1
a = 10, b = 1
a = 0, b = 0

3.布尔类型

布尔类型是C++中的基本数据类型
可以定义bool类型的全局变量
可以定义bool类型的常量
可以定义bool类型的指针
可以定义bool类型的数组
。。。

4.三目运算符

C++对三目运算符进行了升级
下面的代码正确吗?

int a = 1;
int b = 2;
(a < b ? a : b) = 3;
printf(“a = %d, b = %d\n”, a ,b);

test.cpp

#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    (a < b ? a : b) = 3; //等价于a = 3;
    printf("a = %d, b = %d\n", a ,b);
    return 0 ;
}
运行结果
lkk@lkk-virtual-machine:~/c++$ g++ test.cpp
lkk@lkk-virtual-machine:~/c++$ 

test.c

#include <stdio.h>
int main(void)
{
    int a = 1;
    int b = 2;
  
    (a < b ? a : b) = 3;
    printf("a = %d, b = %d\n", a ,b);
    return 0 ;
}
运行结果
lkk@lkk-virtual-machine:~/c++$ gcc test.c
test.c: In function ‘main’:
test.c:8:21: error: lvalue required as left operand of assignment

(a < b ? a : b) = 3;
C语言中的三目运算符返回的是变量值
不能作为左值使用
C++中的三目运算符可直接返回变量本身
既可作为右值使用,又可作为左值使用
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。
思考
C++对三目运算符做了怎样的升级?这种升级的意义是什么?
所有可能的返回都是变量时,它返回的是变量本身,具体内容是C++的引用

4.C++中的引用

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

问题:
一段连续的存储空间只能有一个别名吗?可以有其他别名
在C++中新增加了引用的概念
引用可以看做一个已定义变量的别名
引用的语法:Type& name = var;
int a = 4;
int& b = 4; //b为a的别名,a的类型为int,b的类型也为int
b = 5; //操作b就是操作a

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

4-2 引用初体验

#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;
}
运行结果
lkk@lkk-virtual-machine:~/c++$ g++ 4-2.cpp
lkk@lkk-virtual-machine:~/c++$ ./a.out
a = 5
b = 5
&a = 0x7ffd6546513c
&b = 0x7ffd6546513c

当将改为float& b = a;
报错:
4-2.cpp: In function ‘int main(int, char**)’:
4-2.cpp:6:16: error: invalid initialization of non-const reference of type ‘float&’ from an rvalue of type ‘float’
float& b = a;
C++对三目运算符做了什么?
当三目运算符的可能返回都是变量时,返回的是变量引用
当三目运算符的可能返回中有常量时,返回的是值
int a = 1;
int b = 2;
(a < b ? a: b) = 3; //正确,返回a或b的引用,可作为左值
(a < b ? 1: b) = 3; //错误,返回1或b的值,不能作为左值
小结
bool类型是C++新增加的基础类型
bool类型的值只能是true和false
C++中的三目运算符可作为左值使用
C++中的引用可以看做变量的别名来使用
三目运算符的可能返回都是变量时,返回的是引用

猜你喜欢

转载自blog.csdn.net/weixin_42187898/article/details/83152703