C++中的布尔类型:
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false(在程序编写上使用true或false,在编译器内部还是用1或0)
理论上bool只占用一个字节
注意:
true代表真值,编译器内部用1来表示
false代表非真值,编译器内部用0来表示
C语言中没有对应的布尔的基本的类型,一般用int代替,这在功能上是可以的,但是显得不那么严谨。
C++在类型上进行了加强,所以引入了bool类型。
下面的代码会输出什么?
将0赋值给bool类型的变量b是合法的,C++要让这种语法能编译过去,因为要兼容C语言。
为了兼容C语言,C++中的bool类型是支持数学运算的,只不过C++编译器在内部会做一些调整,运算之后如果是非零值,C++编译器会将这个值直接转换为true。0值直接转换为false。
对上述的程序进行编译并运行,结果如下:
b=b-3导致b的值为-2,但由于b是bool类型,C++编译器会对其内部的值进行调整,只要不是0最终都会变成1。
再次看示例程序:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 bool b = false; 6 int a = b; 7 8 printf("sizeof(b) = %d ", sizeof(b)); 9 printf("b = %d, a = %d ", b, a); 10 11 b = 3; 12 a = b; 13 14 printf("b = %d, a = %d ", b, a); 15 16 b = -5; 17 a = b; 18 19 printf("b = %d, a = %d ", b, a); 20 21 a = 10; 22 b = a; 23 24 printf("a = %d, b = %d ", a, b); 25 26 a = 0; 27 b = a; 28 29 printf("a = %d, b = %d ", a, b); 30 31 return 0; 32 }
执行结果如下:
从输出结果可以得到,bool类型占用了1个字节。
布尔类型是C++中的基本数据类型:
C++对三目运算符进行了升级,考虑下面的代码正确吗?
三目运算符放到了赋值符号的左边,在C语言中三目运算符不能当做左值来使用。
用C语言编译器对上述程序进行编译,结果如下:
可见,在C语言中三目运算符当做左值时会报错。
用C++编译器进行编译并执行,结果如下:
a<b为真,a被返回并被赋值为3。
C语言中的三目运算符返回的是变量的值(是值,不是变量本身),不能作为左值使用
C++中的三目运算符可直接返回变量本身,既可作为右值使用,又可作为左值使用。
注意:
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
例:
我们将三目运算符中的一个值写成了2,用g++编译,结果如下:
C++中的三目运算符返回变量本身,这种升级的意义是什么呢?C++对三目运算符做了什么?这些问题我们在后面回答。
变量名回顾:
一段连续的存储空间只能有一个别名吗?这在C++中是不一定的,C++中进行了升级,一段存储空间可以有多个别名,于是引用的概念就出来了。
在C++中新增加了引用的概念:
引用可以看做一个已定义变量的别名
C++是强类型的,所以普通引用在定义时必须用同类型的变量进行初始化。
C+引用的程序示例如下:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 4; 6 int& b = a; 7 8 b = 5; 9 10 printf("a = %d ", a); 11 printf("b = %d ", b); 12 printf("&a = %p ", &a); 13 printf("&b = %p ", &b); 14 15 return 0; 16 }
执行结果如下:
a和b打印出的地址是一样的,这说明它们代表的是内存中的同一块存储空间。
将b的类型改为float类型,如下:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 4; 6 float& b = a; 7 8 b = 5; 9 10 printf("a = %d ", a); 11 printf("b = %d ", b); 12 printf("&a = %p ", &a); 13 printf("&b = %p ", &b); 14 15 return 0; 16 }
编译结果如下:
C++是强类型语言,从上图可见,不同类型的赋值出错了。
再次修改程序如下:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 4; 6 float& b; 7 8 b = 5; 9 10 printf("a = %d ", a); 11 printf("b = %d ", b); 12 printf("&a = %p ", &a); 13 printf("&b = %p ", &b); 14 15 return 0; 16 }
编译结果如下:
引用必须要初始化。
再次做如下实验:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int a = 4; 6 float& b = 1; 7 8 b = 5; 9 10 printf("a = %d ", a); 11 printf("b = %d ", b); 12 printf("&a = %p ", &a); 13 printf("&b = %p ", &b); 14 15 return 0; 16 }
编译结果如下:
从概念上说,b必须是另一个变量的别名,不可能是字面常量1这样的别名。字面常量不需要别名。
通过以上的实验,我们对引用有了一定的认识,至此可以回答上面遗留的问题了,C++对三目运算符做了什么?
小结:
bool类型是C++新增加的基础类型
bool类型的值只能是true或false
C++中的三目运算符可作为左值使用
C++中的引用可以看做变量的别名来使用
三目运算符的可能返回都是变量时,返回的是引用