0.目录

1.布尔类型

2.三目运算符

3.小结

1.布尔类型

C++中的布尔类型:

  • C++在C语言的基本类型系统之上增加了bool
  • C++中的bool可取的值只有true和false
  • 理论上bool只占用一个字节

注意:

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

布尔类型的值:

  • bool类型只有true(非0)和false(0)两个值
  • C++编译器会将非0值转换为true,0值转换为false

下面的代码输出什么?

#include <stdio.h>

int main()
{
bool b = 0;
printf("b = %d\n", b); b++;
printf("b = %d\n", b); b = b - 3;
printf("b = %d\n", b); return 0;
}

以上代码gcc编译不过,g++编译成功。

运行结果如下:

[root@bogon Desktop]# gcc test.c
test.c: In function ‘main’:
test.c:5: error: ‘bool’ undeclared (first use in this function)
test.c:5: error: (Each undeclared identifier is reported only once
test.c:5: error: for each function it appears in.)
test.c:5: error: expected ‘;’ before ‘b’
test.c:6: error: ‘b’ undeclared (first use in this function)
[root@bogon Desktop]# g++ test.c
[root@bogon Desktop]# ./a.out
b = 0
b = 1
b = 1

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

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

下面代码输出什么?

#include <stdio.h>

int main()
{
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;
}

运行结果:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
sizeof(b) = 1
b = 0, a = 0
b = 1, a = 1
b = 1, a = 1
a = 10, b = 1
a = 0, b = 0

2.三目运算符

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

下面的代码正确吗?

#include <stdio.h>

int main()
{
int a = 1;
int b = 2; (a < b ? a : b) = 3;
printf("a = %d, b = %d\n", a, b); return 0;
}

运行结果:

[root@bogon Desktop]# gcc test.c
test.c: In function ‘main’:
test.c:8: error: lvalue required as left operand of assignment
[root@bogon Desktop]# g++ test.c
[root@bogon Desktop]# ./a.out
a = 3, b = 2

C语言中的三目运算符返回的是变量值——不能作为左值使用;

C++中的三目运算符可直接返回变量本身——既可作为右值使用,又可作为左值使用。

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

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

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

那么何为引用呢?

变量名回顾:

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

(问题:一段连续的存储空间只能有一个别名吗?)

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

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



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

下面的代码会输出什么?

#include <stdio.h>

int main()
{
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;
}

运行结果如下:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
a = 5
b = 5
&a = 0x7ffc082aaec4
&b = 0x7ffc082aaec4

(操作b就等于操作a,意味着b这个标识符和a这个标识符代表了内存里面同一段连续的空间。结论:在C++中完全可以对同一段连续的内存起任意多的别名。)

以下三个程序C++编译器编译都不过,请自行查找错误。

// test1.cpp
#include <stdio.h> int main()
{
int a = 4;
float& b = a; b = 5; printf("a = %d\n", a);
printf("b = %d\n", b);
printf("&a = %d\n", &a);
printf("&b = %d\n", &b); return 0;
}
// test2.cpp
#include <stdio.h> int main()
{
int a = 4;
float& b; b = 5; printf("a = %d\n", a);
printf("b = %d\n", b);
printf("&a = %d\n", &a);
printf("&b = %d\n", &b); return 0;
}
// test3.cpp
#include <stdio.h> int main()
{
int a = 4;
float& b = 1; b = 5; printf("a = %d\n", a);
printf("b = %d\n", b);
printf("&a = %d\n", &a);
printf("&b = %d\n", &b); return 0;
}

3.小结

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

C++解析(3):布尔类型与三目运算符的更多相关文章

  1. POJO类中的任何布尔类型的变量,都不要加is

    POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误. 定义为基本数据类型boolean isSuccess:的属性,它的方法也是isSuccess(),HSF框架在反向解 ...

  2. python基础——数字&集合&布尔类型

    Python的核心数据类型 内置对象 对象类型 例子 数字 123,3.1415,3+4j,Decimal(小数),Fraction(分数) 字符串 'dodo',"guido's" ...

  3. Objective-C 布尔类型&#160;和 class、SEL类型

    发现非常多刚開始学习的人无法区分bool和BOOL及class类型,今天闲来无事.写个博文做个区分 1. bool是C语言的布尔类型.有true和false,BOOL是Objective C 语言的布 ...

  4. C++中的布尔类型和引用

    1,C++ 中的布尔类型: 1,C++ 在 C 语言的基础类型系统之上增加了 bool: 1,C 语言中,没有 bool 类型存在,往往都是用整型代替 bool 类型,常用 0 表示假,用 1 表示真 ...

  5. ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换

    js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...

  6. POJO类中布尔类型为啥不让用isXxx命名

    源码面前,了无秘密 <阿里开发规范泰山版>(2020.04.22)-->编程规约-->(一) 命名风格-->第8条规定: [强制]POJO 类中的任何布尔类型的变量,都不 ...

  7. .NET面试题解析(01)-值类型与引用类型

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...

  8. go语言 类型:布尔类型

    Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和false示例代码如下: var v1 bool v1 = true v2 := (1 == 2) // v2也会 ...

  9. Python中布尔类型

    我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算:与运算:只有两个布尔值都为 True 时,计算结果才为 True.True and T ...

随机推荐

  1. Spring框架实例

    一,介绍 Spring框架核心是Ioc控制反转,只要在容器中注册以后,依赖从容器中获取即可 简单的理解:需要一个值,在程序中定义一个变量,但是不赋值,只设置set方法,运行时,容器为该变量赋值 二,实 ...

  2. 【BZOJ4016】[FJOI2014]最短路径树问题

    [BZOJ4016][FJOI2014]最短路径树问题 题面 bzoj 洛谷 题解 虽然调了蛮久,但是思路还是蛮简单的2333 把最短路径树构出来,然后点分治就好啦 ps:如果树构萎了,这组数据可以卡 ...

  3. Mysql:存储过程游标不进循环的原因详解

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客给刚接触存储过程的朋友做个引导作用,目的是解决游标不走循环 很多人发现他的游标,无论是嵌套循环还是单层 ...

  4. 洛谷1552 [APIO2012]派遣

    洛谷1552 [APIO2012]派遣 原题链接 题解 luogu上被刷到了省选/NOI- ...不至于吧 这题似乎有很多办法乱搞? 对于一个点,如果他当管理者,那选的肯定是他子树中薪水最少的k个,而 ...

  5. LUIS 语义识别API调用方法

    本例使用itchat获取微信文字消息,发送给LUIS返回识别消息,再将返回消息格式化后通过微信发回 关于itchat的使用参考我的另外一篇随笔itchat个人练习 语音与文本图灵测试例程 # -*- ...

  6. 使用idea写ssm的时候提示源文件夹中的文件找不到

    <context:property-placeholder location="classpath:db.properties"/>这一行idea提示找不到db.pro ...

  7. Java 分割、合并byte数组

    场景:上传文件较大,把存放文件内容byte数组拆分成小的.下载的时候按照顺序合并. 起初觉得挺麻烦的,写完觉得挺简单. 切割: /** * 拆分byte数组 * * @param bytes * 要拆 ...

  8. Jmeter接口测试(一) Jmeter简介

    一.Jmeter介绍 (一)Jmeter简介 Apache JMeter 是 Apache 组织的开放源代码项目,是一个纯 Java 桌面应用,用于压力测试和性能测试.它最初被设计用于 Web 应用测 ...

  9. Select 、Poll 和 Epoll

    作用 Epoll 和 Select 的作用都是为了多I/O同步复用的问题,利用Epoll.Poll或Select函数指定内核监听多个I/O的读.写.异常事件,避免每一个I/O都指定一个处理线程,导致开 ...

  10. 袋鼠云研发手记 | 袋鼠云EasyManager的TypeScript重构纪要

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...