C++简明分析讲解布尔类型及引用

目录
  • 一、C++中的布尔类型
  • 二、C++中的三目运算符
  • 三、C++中的引用
  • 四、总结

一、C++中的布尔类型

  • C++在C语言的基本类型系统之上增加了bool
  • C++中的bool可取的值只有true和 false
  • 理论上bool只占用一个字节
  • C++编译器会将非0值转换为true ,0值转换为false

注意:

true代表真值,编译器内部用1来表示

false代表非真值,编译器内部用0来表示

下面看一下这段代码,加深一下对bool类型的理解。

#include <stdio.h>

int main(int argc, char *argv[])
{
    bool b = 0;
    printf("b = %d\n", b);
    b++;
    printf("b = %d\n", b);
    b = b - 3;
    printf("b = %d\n", b);
    return 0;
}

下面为输出结果,可以看到0值输出为0,而非0值输出为1,和上面介绍的一样。

接下来再上一段代码,再次加深对布尔类型的理解。

#include <stdio.h>
int main(int argc, char *argv[])
{
    bool b = false;
    int a = b;
    printf("sizeof(b) = %d\n", sizeof(b));
    printf("b = %d, a = %d\n", b, a);
    b = 3;
    a = b;
    printf("b = %d, a = %d\n", b, a);
    b = -5;
    a = b;
    printf("b = %d, a = %d\n", b, a);
    a = 10;
    b = a;
    printf("a = %d, b = %d\n", a, b);
    a = 0;
    b = a;
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

下面为输出结果,可以看到bool类型只占用一个字节,且输出符合上面讲的理论。

布尔类型是C++中的基本数据类型

  • 可以定义bool类型的全局变量
  • 可以定义bool类型的常量
  • 可以定义bool类型的指针
  • 可以定义bool类型的数组
  • ......

二、C++中的三目运算符

C++对三目运算符进行了升级

C语言中的三目运算符返回的是变量值

  • 不能作为左值使用

C++中的三目运算符可直接返回变量本身

  • 既可作为右值使用,又可作为左值使用

注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。

通过下面这个程序来说明一下C++对于三目运算符的升级。

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a = 1;
	int b = 1;
	(a < b ? a : b) = 3;
	printf("a = %d, b = %d\n", a, b);
    return 0;
}

下面为输出结果,可以看到上面的程序在C语言的编译条件下编译不通过,而在C++的编译条件下编译通过,这说明在(a < b ? a : b)代码中,因为a < b ,所以输出a的值,然后把3赋值给a。

C++对三目运算符做了什么?

  • 当三目运算符的可能返回都是变量时,返回的是变量引用
  • 当三目运算符的可能返回中有常量时,返回的是值

从C++编译器输出结果也可知,第一种写法编译可以通过,第二种写法编译不通过,如下图所示。

三、C++中的引用

变量名回顾

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

变量命名及对应地址

在C++中新增加了引用的概念

  • 引用可以看作一个已定义变量的别名
  • 引用的语法: Type& name = var;

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

以下面的程序为例,说明一下引用。

#include <stdio.h>
int main(int argc, char *argv[])
{
	int a = 4;
	int& b = a;    //b为a的别名
	printf("a = %d, b = %d\n", a, b);    //操作b就是操作a
    return 0;
}

下面为输出结果,可以看到a和b均为4,这就很好的说明了引用的概念。

为了进一步理解引用,下面对上述程序进行了修改。

#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;
}

下面为输出结果,因为我们通过a变量的别名b对a变量进行了修改,操作b就相当于操作a,C++中可以对同一段连续的内存起任意多的别名,所以标识符a和b代表内存里面同一段连续的空间。

如果我们把 int& b = a; 改成float& b = a; 或者改成 float& b; 或者改成float& b = 1,则编译器分别报如下错误,这说明C++编译器对数据类型要求是非常严格的。

四、总结

  • bool类型是C++新增加的基础类型
  • bool类型的值只能是true和false
  • C++中的三目运算符可作为左值使用
  • C++中的引用可以看作变量的别名来使用
  • 三目运算符的可能返回都是变量时,返回的是引用

到此这篇关于C++简明分析讲解布尔类型及引用的文章就介绍到这了,更多相关C++布尔类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中引用的相关知识点小结

    目录 引用的概念 引用特性 常引用 使用场景 引用和指针的区别 总结 引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间. 比如:李逵,在家称为"铁牛",江湖上人称"黑旋风".那么这里的“铁牛”.“黑旋风”就称李逵的引用. 在程序中呢,引用的用法如下: 类型& 引用变量名(对象名) = 引用实体: 举个例子: void TestRef() { int a = 10; int&

  • 带你了解C++初阶之引用

    目录 一. 引用概念 二. 引用特性 三. 常引用 四. 使用场景 1.做参数 指针 引用 2.做返回值 2.1.传值返回 2.2.传引用返回 小结引用做返回值 五.函数参数及返回值 —— 传值.传引用效率比较 六. 引用和指针的区别 1.语法概念 2.底层实现 总结 一. 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,语法理解上程序不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间 比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"

  • C++深入探究引用的本质与意义

    目录 一.引用的意义 二.特殊的引用 三.引用是否占用存储空间 四.引用的本质 五.引用的注意事项 六.小结 一.引用的意义 引用作为变量别名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 下面通过代码来进行说明,在C语言中,可以这么写: #include <stdio.h> void swap(int* a, int* b) { int t = *a; *a = *b; *b = t; } int main() { int a = 1; int b = 2;

  • C++简明分析讲解布尔类型及引用

    目录 一.C++中的布尔类型 二.C++中的三目运算符 三.C++中的引用 四.总结 一.C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和 false 理论上bool只占用一个字节 C++编译器会将非0值转换为true ,0值转换为false 注意: true代表真值,编译器内部用1来表示 false代表非真值,编译器内部用0来表示 下面看一下这段代码,加深一下对bool类型的理解. #include <stdio.h> int ma

  • C++简明分析讲解引用与函数提高及重载

    目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &新变量名 =原来变量名 作用:给变量起别名 注意事项: 1.引用必须初始化 2.一旦初始化就不能更改(具体原因在下面引用本质上会讲到) 示例: int a = 10; int c = 20; 如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址. 所以这样写 int &b=a

  • C++关于const与引用的分析讲解

    目录 一.关于 const 的疑问 二.关于引用的疑问 三.小结 一.关于 const 的疑问 const 什么时候为只读变量?什么时候是常量? const 常量的判别准则 只有用字面量初始化的 const 常量才会进入符号表 使用其他变量初始化的 const 常量仍然是只读变量 被 volatile 修饰的 const 常量不会进入符号表 注:在编译期间不能直接确定初始值的 const 标识符,都被作为只读变量处理. const 引用的类型与初始化变量的类型 如果相同,则初始化变量成为只读变量

  • C++详细分析讲解引用的概念与使用

    目录 1.引用的概念 2.引用的格式 3.引用的特性 4.取别名原则 5.引用的使用场景 做参数 做返回值 int&Count()的讲解 传值传引用效率比较 6.引用和指针的不同点 1.引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间. 2.引用的格式 类型 & 引用变量名 ( 对象名 ) = 引用实体: 举例如下: 注意:引用类型必须和引用实体是同种类型的 3.引用的特性 (1). 引用在 定义时必须初

  • C语言简明分析指针与引用的具体用法

    目录 1.指针 2.引用 1.指针 在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元.为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根据地址编号,可准确找到其对应的内存单元.由于每一个地址编号均对应一个内存单元,因此可以形象地说一个地址编号就指向一个内存单元.C 语言中把地址形象地称作指针. 主要就是两个运算符:&和*. & 表示求地址,*表示求地址中的值,*也可以用来定义指针(int *p表示整型指针): int a=1; int *

  • Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用

    目录 1. 前言 2. 包装类 3. 自动装箱与自动拆箱 4. Interger缓存 5. 回答题目 1. 前言 自动装箱和自动拆箱是什么?Integer缓存是什么?它们之间有什么关系? 先来看一道题目. Integer a = new Integer(1); Integer b = new Integer(1); System.out.println(a==b); Integer c = 1; Integer d = 1; System.out.println(c==d); Integer e

  • Java泛型与注解全面分析讲解

    目录 1.什么是泛型 2.为何使用泛型 2.1.如何定义泛型 2.2.通配符 2.3.受限泛型 2.4.泛型接口 2.5.泛型方法 3.java高级--注解 3.1.预定义注解 3.2.自定义注解(初级) 3.3.元注解 3.4.自定义注解(高级) 1.什么是泛型 其实我们在使用集合时就用过泛型List<T> 创建一个List对象List<Student> list=new ArrayList():<T>它就是泛型. 所谓的泛型就是在类定义时,不为类中属性和方法指定数据

  • JavaScript错误处理机制全面分析讲解

    目录 1. Error 实例 2. 原生错误类型 2.1 ReferenceError 2.2 SyntaxError 2.3 TypeError 2.4 RangeError 2.5 URIError 2.6 evalError 3. 自定义错误类型 4. throw 5. try…catch 6. finally 总结 1. Error 实例 JavaScript在运行错误时会抛出一个错误,JS提供了Error构造函数,所有抛出的错误都是这个构造函数的实例 const err = new E

  • C++ Boost Foreach超详细分析讲解

    目录 一.说明 二.示例代码 2.1 最简单的代码 2.2 使用BOOST_FOREACH与BOOST_REVERSE_FOREACH 三.BOOST_FOREACH特点和应用范围 四.遍历循环控制 一.说明 Boost.Foreach Boost.Foreach 提供了一个宏来模拟 C++11 中基于范围的 for 循环.您可以使用在 boost/foreach.hpp 中定义的宏 BOOST_FOREACH 来迭代序列而不使用迭代器.如果你的开发环境支持C++11,可以忽略Boost.For

  • GoLang逃逸分析讲解

    目录 概念 逃逸分析准则 逃逸分析大致思路 概念 当一个对象的指针在被多个方法或者线程引用,称为逃逸分析, 逃逸分析决定一个变量分配在堆上还是栈上, 当然是否发生逃逸是由编译器决定的 分配栈和堆上变量的问题 1.局部变量在栈上(静态分配),函数执行完毕后,自动被栈回收,导致其他对此变量引用出现painc null 指针异常, 栈用户态实现goroutine 作为执行上下文 2.将变量 new 方式分配在堆上(动态分配),堆上有个特点,变量不会被删除,但是会造成内存异常 // 如下代码导致 程序崩

随机推荐