C++解析(3):布尔类型与三目运算符
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):布尔类型与三目运算符的更多相关文章
- POJO类中的任何布尔类型的变量,都不要加is
POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误. 定义为基本数据类型boolean isSuccess:的属性,它的方法也是isSuccess(),HSF框架在反向解 ...
- python基础——数字&集合&布尔类型
Python的核心数据类型 内置对象 对象类型 例子 数字 123,3.1415,3+4j,Decimal(小数),Fraction(分数) 字符串 'dodo',"guido's" ...
- Objective-C 布尔类型 和 class、SEL类型
发现非常多刚開始学习的人无法区分bool和BOOL及class类型,今天闲来无事.写个博文做个区分 1. bool是C语言的布尔类型.有true和false,BOOL是Objective C 语言的布 ...
- C++中的布尔类型和引用
1,C++ 中的布尔类型: 1,C++ 在 C 语言的基础类型系统之上增加了 bool: 1,C 语言中,没有 bool 类型存在,往往都是用整型代替 bool 类型,常用 0 表示假,用 1 表示真 ...
- ECMAScript1.1 js书写位置 | 声明变量 | 基本数据类型 | 数据类型转换 | 操作符 | 布尔类型的隐式转换
js书写位置 由于在写css样式时使用的时双引号,所以我们在写js代码时建议使用单引号(‘’)! 行内式 <input type="button" value="点 ...
- POJO类中布尔类型为啥不让用isXxx命名
源码面前,了无秘密 <阿里开发规范泰山版>(2020.04.22)-->编程规约-->(一) 命名风格-->第8条规定: [强制]POJO 类中的任何布尔类型的变量,都不 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
- go语言 类型:布尔类型
Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和false示例代码如下: var v1 bool v1 = true v2 := (1 == 2) // v2也会 ...
- Python中布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算:与运算:只有两个布尔值都为 True 时,计算结果才为 True.True and T ...
随机推荐
- Discover Feature Engineering, How to Engineer Features and How to Get Good at It
Feature engineering is an informal topic, but one that is absolutely known and agreed to be key to s ...
- 【洛谷P4178】Tree
题面 题解 感觉和\(CDQ\)分治一样套路啊 首先,构建出点分树 对于每一层分治重心,求出它到子树中任意点的距离 然后\(two-pointers\)计算满足小于等于\(K\)的点对数目,加入答案 ...
- 使用T4模板报错:“正在编译转换;当前上下文中不存在名称Host”
用T4模板生成多个文件的实体时,有一句代码是这样的 string curPath = Path.GetDirectoryName(Host.TemplateFile); ...
- Android开发笔记——视频录制播放常见问题
本文分享自己在视频录制播放过程中遇到的一些问题,主要包括: 视频录制流程 视频预览及SurfaceHolder 视频清晰度及文件大小 视频文件旋转 一.视频录制流程 以微信为例,其录制触发为按下(住) ...
- selenium自动化之元素定位方法
在使用selenium webdriver进行元素定位时,有8种基本元素定位方法(注意:并非只有8种,总共来说,有16种). 分别介绍如下: 1.name定位 (注意:必须确保name属性值在当前ht ...
- selenium自动化之js处理滚动条和元素聚焦
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当我们页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的.这时候需要借助滚动 ...
- qs.js - 更好的处理url参数
第一次接触 qs 这个库,是在使用axios时,用于给post方法编码,在使用过程中,接触到了一些不同的用法,写在这里分享一下. qs.parse qs.parse 方法可以把一段格式化的字符串转换为 ...
- 8 个用于业余项目的优秀 Python 库
在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留.对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直停留在 Python 的世界里,不愿离开,那就是我们可以很容 ...
- 2.0 flume、sqoop、oozie/Azkaban
在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出.任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中都有便 ...
- Spark之spark shell
前言:要学习spark程序开发,建议先学习spark-shell交互式学习,加深对spark程序开发的理解.spark-shell提供了一种学习API的简单方式,以及一个能够进行交互式分析数据的强大工 ...