布尔类型及引用(三)
今天我们来学习下 C++ 中的布尔类型。说起布尔类型,有的同学可能在 C 语言中听过,0 代表假,1 代表真。我们在 C 语言中用 int 类型的数来表示布尔类型,这也是可取的。但是在 C++ 中正式引出了布尔类型这个概念,它是一种基本类型。C++ 中的 bool 可取的值只有 true 和 false,理论上 bool 只占用一个字节。注意:true 代表真值,编译器内部用 1 来表示;false 代表非真值编译器内部用 0 来表示。
bool 类型只有 true(非0)和 false(0)两个值,C++ 编译器会将非 0 值转换为 true,0 值转换为 false。下来我们来以代码为例进行分析
#include<stdio.h>intmain(intargc,char*argv[]){boolb=false;inta=b;printf("sizeof(b)=%d\n",sizeof(b));//1printf("b=%d,a=%d\n",b,a);//0,0b=3;a=b;printf("b=%d,a=%d\n",b,a);//1,1b=-5;a=b;printf("b=%d,a=%d\n",b,a);//1,1a=10;b=a;printf("a=%d,b=%d\n",a,b);//10,1a=0;b=a;printf("a=%d,b=%d\n",a,b);//0,0return0;}
我们分析下,第 8 行打印 bool 类型 b 的内存大小,那么便是为 1 了。由于它初始化为 false ,所以为 0, a = b 当然也为 0 了;第 11 行 b 为非 0。所以第 14 行打印出 1, 1;第 16 行 b 为非 0。所以第 19 行打印出 1, 1;第 21 行 a 为 10,所以第 24 行打印出 10, 1;第 26 行 a 为 0,所以第 29 行打印出 0, 0啦。我们看看编译结果
因为布尔类型是 C++ 中的基本数据类型,所以我们可以定义 bool 类型的:局部变量、全局变量、常量、指针、数组 ... ; C++ 对三目运算符也进行了升级,在 C 语言中的三目运算符返回的是变量值,不能作为左值使用;但在 C++ 中,三目运算符可直接返回变量本身,所以它即可作为右值使用,又可作为左值使用。注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。
下来我们以代码为例进行分析
#include<stdio.h>intmain(intargc,char*argv[]){inta=1;intb=2;(a<b?a:b)=3;printf("a=%d,b=%d\n",a,b);return0;}
这段代码在 gcc 中肯定编译通不过因为三目运算符返回的是变量值,给常量赋值肯定出问题,那么在 g++ 中,它可以通过,返回的是变量本身,所以第 8 行相当于 a = 3。我们来看看编译结果
我们看到 gcc 编译直接报错,但是 g++ 编译通过,并且成功的改变了 a 的值。在这块我们就不得不提变量名了,我们之前学过变量是一段实际连续存储空间的别名;程序中通过变量来申请并命名存储空间;通过变量的名字可以使用存储空间。我们再来想一个问题:一段连续的存储空间只能有一个别名吗?在 C++ 中新增了引用的概念。那么什么是引用呢?引用可以看作一个已定义变量的别名,它的语法格式是:TYpe& name = var;注意:普通引用在定义时必须同同类型的变量进行初始化。我们以代码为例进行分析
#include<stdio.h>intmain(intargc,char*argv[]){inta=3;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);return0;}
我们看到在第 6 行进行了 a 的引用,也就是说, b 为 a 的别名,改变 b 的值就相当于改变 a 的值啦。我们看看编译结果
我们看到 a 和 b 都改为了 5,并且他俩的地址是一样的,也就证明了 b 是 a 的别名。那么回到之前的三目运算符的问题,当三目运算符的可能返回值都是变量时,返回的是变量引用;当三目运算符的可能返回值中有常量时,返回的是值。如下所示
通过对布尔类型和引用的学习,总结如下:1、bool 类型是 C++ 新增加的基础类型,它的值只能是 true 和 false;2、C++ 中的三目运算符可作为左值使用;3、C++ 中的引用可以看作变量的别名来使用;4、三目运算符的可能返回都是变量时,返回的是引用。
欢迎大家一起来学习 C++ 语言,可以加我QQ:243343083。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。