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++中的引用可以看作变量的别名来使用
  • 三目运算符的可能返回都是变量时,返回的是引用

最新文章

  1. [LeetCode] Word Search 词语搜索
  2. java从基础知识(九)I/O
  3. Oracle 过程中检查数据表存在与否
  4. Vs2012编写C语言
  5. 安装Nginx的Dockerfile实例
  6. Tomcat常见的内存溢出,以及解决方法
  7. ng-repeat的group
  8. js中批量处理样式——cssText的使用
  9. Debugging with GDB 用GDB调试多线程程序
  10. js 调用父窗口的方法
  11. Laravel生成编译文件权限问题
  12. HTTPS和HTTP的区别是什么?
  13. The connection to the server localhost:8080 was refused - did you specify the right host or port?
  14. LibreOJ #6014. 「网络流 24 题」最长 k 可重区间集
  15. jQuery 实现图片动画代码
  16. Docker linux安装
  17. asp.net core 1.1 项目升级至 asp.net core 2.0 preview 2 与正式版
  18. vins-mono代码解读
  19. 【Linux学习一】命令查看与帮助
  20. 阿里云 持续集成环境自动部署cordova项目热更新脚本

热门文章

  1. 树链剖分学习&amp;BZOJ1036
  2. RHCSA day5
  3. 【CF833E】Caramel Clouds
  4. 基于ejabberd简单实现xmpp群聊离线消息
  5. XAF-属性编辑器中的EditMask,DisplayFormat格式化字符串该如何设置
  6. Linux 内核3.10.5 专场
  7. [转]操作系统Unix、Windows、Mac OS、Linux的故事
  8. Linux 安装Redis&lt;单机版&gt;(使用Mac远程访问)
  9. UTF-8编码下&#39;\u7528\u6237&#39;转换为中文汉字&#39;用户&#39;
  10. 前端之JavaScript(二)