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\n", sizeof(b));
 9     printf("b = %d, a = %d\n", b, a);
10     
11     b = 3;
12     a = b;
13     
14     printf("b = %d, a = %d\n", b, a);
15     
16     b = -5;
17     a = b;
18     
19     printf("b = %d, a = %d\n", b, a);
20     
21     a = 10;
22     b = a;
23     
24     printf("a = %d, b = %d\n", a, b);
25     
26     a = 0;
27     b = a;
28     
29     printf("a = %d, b = %d\n", 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\n", a);
11     printf("b = %d\n", b);
12     printf("&a = %p\n", &a);
13     printf("&b = %p\n", &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\n", a);
11     printf("b = %d\n", b);
12     printf("&a = %p\n", &a);
13     printf("&b = %p\n", &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\n", a);
11     printf("b = %d\n", b);
12     printf("&a = %p\n", &a);
13     printf("&b = %p\n", &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\n", a);
11     printf("b = %d\n", b);
12     printf("&a = %p\n", &a);
13     printf("&b = %p\n", &b);
14     
15     return 0;
16 }

编译结果如下:

 

从概念上说,b必须是另一个变量的别名,不可能是字面常量1这样的别名。字面常量不需要别名。

 

通过以上的实验,我们对引用有了一定的认识,至此可以回答上面遗留的问题了,C++对三目运算符做了什么?

 

小结:

  bool类型是C++新增加的基础类型

  bool类型的值只能是true或false

  C++中的三目运算符可作为左值使用

  C++中的引用可以看做变量的别名来使用

  三目运算符的可能返回都是变量时,返回的是引用

 

posted on 2018-08-20 23:23  周伯通789  阅读(259)  评论(0)    收藏  举报