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 ...
随机推荐
- 新技能get,使用PHPStorm的deployment工具
1. 工具栏 Tools - Deployment - Configuration 2. 添加一个服务端的配置信息 type 类型可以选择:FTP.local等. 填完信息别忘了点"Test ...
- 2017"百度之星"程序设计大赛 - 初赛(A) 小C的倍数问题
谢谢帮忙刷访问量! 题解当然下考再发啦 答案为P-1的约数个数 // It is made by XZZ #include<cstdio> #include<algorithm> ...
- 解决 mybatis 的覆盖问题 以及避免手写大量mapper的方法
只需要先实现覆盖不追加的方法: 然后再把所有需要改动mapper的方法抽离出来即可
- scikit-learn API
scikit-learn API 这是scikit-learn的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以提供有关其用途的完整指南. sklearn.base:基 ...
- MySQL数据库--连接
MySQL数据库的概念: MySQL数据库,包括客户端和服务端.客户端就是操作数据库的终端(命令行.navicat),服务端就是安装有MySQL软件的主机(本机或者服务器),MySQL数据库的端口一般 ...
- mysql 数据库优化之执行计划(explain)简析
数据库优化是一个比较宽泛的概念,涵盖范围较广.大的层面涉及分布式主从.分库.分表等:小的层面包括连接池使用.复杂查询与简单查询的选择及是否在应用中做数据整合等:具体到sql语句执行效率则需调整相应查询 ...
- 百度地图之自动提示--autoComplete
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- .NET工程师 技能清单
第一次写博客,先说自己对自己的职业定位.NET全栈跨语言工程师 .首先说明自己是微软的狂热粉丝,几乎所有技术都在.NET下进行. 接下来对微软目前的.NET上的技术进行进一步了解,列出一个清单或者说是 ...
- Centos7.2部署saltstack
原文发表于cu:2016-06-23 参考文档: Saltstack安装文档:https://repo.saltstack.com/#rhel saltstack的安装与简单配置,应用. 一.环境 S ...
- 广东ACM省赛 E题
题意: 输入一个P 使得存在一个一个N大于等于P, 并且存在m 等于 m/n * (m-1)/(n-1)=1/2. 思路 此题可以利用佩尔方程求解, 也可以打表解决.本次我解决利用的是佩尔方程(其实也 ...