zoukankan      html  css  js  c++  java
  • 第4课 布尔类型和引用

    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++中的引用可以看做变量的别名来使用

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

  • 相关阅读:
    学习Vue CLI 3.x版本的安装以及创建项目
    Java中同一线程中的对象hashcode一样
    Java中线程范围内共享问题
    Java中的线程池模拟
    java中的Switch
    string、stringbuffer、stringbuild的时间性能对比
    Java中lock上锁 unlock解锁
    java中的三目运算
    Java中的Instanceof
    一个简单的for循环
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9508811.html
Copyright © 2011-2022 走看看