【C++基础】运算符和流程控制语句
C++中的运算符和流程控制语句
- 一、运算符
- 1. C++和Java在通用运算符中的不同之处对比
- 2. C++中的位运算符
- 2.1 移位运算符
- 2.2 位逻辑运算符
- 3. 运算时的类型转换总结
- 3.1 隐式类型转换
- 3.2 显式类型转换(强制类型转换)
- 4. 注意
- 二、流程控制语句
- 1. C++和Java在通用流程控制语句中的不同之处对比
- 2. 跳转语句goto
一、运算符
1. C++和Java在通用运算符中的不同之处对比
| 运算符 | C++ | Java |
|---|---|---|
| 取余运算% | 两个操作数必须是整数类型 | 两个操作数可以是浮点型 |
| 赋值运算= | 运算结果的类型就是左侧运算对象的类型,C++会自动进行隐式转换 | 运算结果的类型如果和左侧运算对象的类型不一致,需要进行显式转换 |
| 逻辑运算符 | 允许算数类型的数据参与运算 | 只允许布尔类型的数据参与运算 |
2. C++中的位运算符
所有的算术类型,占用的空间都是以字节(byte,8位)作为单位来衡量的。在C++中,还有一类非常底层的运算符,可以直接操作到具体的每一位(bit)数据,这就是位运算符。位运算符可以分为两大类:移位运算符,和位逻辑运算符。下面列出了所有位运算符的优先级和用法:

2.1 移位运算符
算术类型的数据对象,都可以看做是一组位的集合。那么利用“位运算符,就可以让运算对象的所有位,整体移动指定的位数。移位运算符有两种:左移运算符<<和右移运算符>>。如下为移位运算符的具体案例:
unsigned char bits = 0xb5; // 181
cout << hex; // 以十六进制显示
cout << "0xb5 左移2位:" << (bits << 2) << endl; // 0x 0000 02d4
cout << "0xb5 左移8位:" << (bits << 8) << endl; // 0x 0000 b500
cout << "0xb5 左移31位:" << (bits << 31) << endl; // 0x 8000 0000
cout << "0xb5 右移3位:" << (bits >> 3) << endl; // 0x 0000 0016cout << dec;
cout << (200 << 3) << endl; // 乘8操作
cout << (-100 >> 2) << endl; // 除4操作,一般右移是补符号位

移位运算符的运算规则如下:
- 较小的整数类型(char、short以及bool)会自动提升成int类型再做移位,得到的结果也是int类型
- 左移运算符
<<将操作数左移之后,在右侧补0; - 右移运算符
>>将操作数右移之后,对于无符号数就在左侧补0;对于有符号数的操作则要看运行的机器环境,有可能补符号位,也有可能直接补0; - 由于有符号数右移结果不确定,一般只对无符号数执行位移操作;
这里解释一下为什么有符号数右移结果不确定,这主要有两个原因:① 有符号数在进行右移动是补的数据是1还是0要根据该数据是正数还是负数来定,正数补0,负数补1② 相同的数据类型在不同的机器环境上的位数是不同的,可能在机器1上的定义正数转移到机器2上就被理解为负数。
2.2 位逻辑运算符
计算机存储的每一个位(bit)都是二进制的,有0和1两种取值,这跟布尔类型的真值表达非常类似。于是自然可以想到,两个位上的0或1都可以执行类似逻辑运算的操作。位逻辑运算符有:按位取反~,位与&,位或|和位异或^。
- 按位取反
~:一元运算符,类似逻辑非。对每个位取反值,也就是把1置为0、0置为1; - 位与
&:二元运算符,类似逻辑与。两个数对应位上都为1,结果对应位为1;否则结果对应位为0; - 位或
|:二元运算符,类似逻辑或。两个数对应位上只要有1,结果对应位就为1;如果全为0则结果对应位为0; - 位异或
^:两个数对应位相同,则结果对应位为0;不同则结果对应位为0;
位逻辑运算的具体案例如下:
// 位逻辑运算
cout << (~5) << endl; // ~ (0... 0000 0101) = 1... 1111 1010, -6
cout << (5 & 12) << endl; // 0101 & 1100 = 0100, 4
cout << (5 | 12) << endl; // 0101 | 1100 = 1101, 13
cout << (5 ^ 12) << endl; // 0101 & 1100 = 1001, 9

3. 运算时的类型转换总结
3.1 隐式类型转换
大多数情况,C++编译器可以自动对类型进行转换,不需要我们干涉,这种方式叫做隐式类型转换。隐式类型转换主要发生在算术类型之间,基本思路就是将长度较小的类型转换成较大的类型,这样可以避免丢失精度。隐式类型转换不仅可以在变量赋值时发生,也可以在运算表达式中出现。
隐式类型转换的一般规则可以总结如下:
- 在大多数算术运算中,较小的整数类型(如bool、char、short)都会转换成int类型。这叫做整数提升;
- 当表达式中有整型也有浮点型时,整数值会转换成相应的浮点类型;
- 在条件判断语句中,其它整数类型会转换成布尔类型,即0为false、非0为true;
- 初始化变量时,初始值转换成变量的类型;
- 在赋值语句中,右侧对象的值会转换成左侧对象的类型;
3.2 显式类型转换(强制类型转换)
除去自动进行的隐式类型转换,我们也可以显式地要求编译器对数据对象的类型进行更改。这种转换叫做强制类型转换(cast)。比如对于除法运算,我们知道整数除法和浮点数除法是不同的。如果希望对一组整数求一个平均数,直接相加后除以个数是无法得到想要的结果的:
// 求平均数
int total = 20, num = 6;
double avg = total / num;
cout << " avg = " << avg << endl; // avg = 3
因为两个int类型的数相除,执行的是整数除法,得到3;再转换成double类型对avg做初始化,得到是3.0。如果想要更准确的结果,就必须将int类型强制转换成double,做浮点数除法。
C++中要想进行强制类型转换,主要有以下三种方式:
- C语言风格:
(类型名称) 值 - C++函数调用风格(推荐):
类型名称 (值) - C++强制类型转换运算符:
static_cast<类型名称> (值)
案例如下:
// C语言风格
cout << " avg = " << (double) total / num << endl;
// C++函数风格
cout << " avg = " << double (total) / num << endl;
// C++强转运算符
cout << " avg = " << static_cast<double>(total) / num << endl;
4. 注意
- 要尽量避免将较大类型的值赋给较小类型的变量,这样很容易出现精度丢失或者数据溢出。
- 如果希望判断一个整型变量a是否在某个范围(0, 100)内,不能直接写:0 < a < 100;由于小于运算符
<满足左结合律,要先计算0 < a,得到一个布尔类型的结果,再跟后面的100进行比较。此时布尔类型做整数提升,不管值是真(1)还是假(0),都会满足 < 100 的判断,因此最终结果一定是true。要想得到正确的结果,需要将两次关系判断拆开,写成逻辑与的关系。
二、流程控制语句
1. C++和Java在通用流程控制语句中的不同之处对比
| 语句 | C++ | Java |
|---|---|---|
| switch | C++中switch中的条件类型必须是整型 | Java中switch中的条件表类型必须是char、byte、short、int、String、enum中的一种 |
2. 跳转语句goto
goto语句表示无条件地跳转到程序中的另一条语句。goto的语法形式为:
goto 标签;
这里的标签可以认为是一条语句的名字,跟变量类似,只不过它是指代一条语句的标识符。定义标签也非常简单,只要在一条语句前写出标识符,然后跟上冒号就可以了,比如:
begin: int a = 0;
下面是一个具体的例子:
int x = 0;cout << "程序开始..." << endl;begin:
do
{cout << " x = " << ++x << endl;
} while (x < 10);if (x < 15) {cout << "回到原点!" << endl;goto begin;
}cout << "程序结束!" << endl;
由于goto可以任意跳转,所以它非常灵活,也非常危险。一般在代码中不要使用goto。
相关文章:
【C++基础】运算符和流程控制语句
C中的运算符和流程控制语句 一、运算符1. C和Java在通用运算符中的不同之处对比2. C中的位运算符2.1 移位运算符2.2 位逻辑运算符 3. 运算时的类型转换总结3.1 隐式类型转换3.2 显式类型转换(强制类型转换) 4. 注意 二、流程控制语句1. C和Java在通用流程…...
AOF文件重写
1.2.3.AOF文件重写 因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。 如图&am…...
第四次面试总结 — 嘉和智能 - 全栈开发
🧸欢迎来到dream_ready的博客,📜相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ;) 专栏 —— 本人真实面经,更多真实面试经验,中大厂面试总结等您挖掘 目录 总结(非详细) 面试内…...
tx-lcn使用
tx-lcn是啥 tx-lcn是一个分布式事务框架,有两个模块组成管理端(server)和client端。 管理端用于分布式事务的注册,事务消息接收,事务消息下发等管理工作。 client端包括事务发起方,事务参与方。 LCN名称是…...
oracle恢复异常处理
问题现象: RMAN> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 21> 22> 23> 24> using target database control file instead of recovery catalog allocate…...
谈谈什么是 Redis
🔥博客主页:fly in the sky - CSDN博客 🚀欢迎各位:点赞👍收藏⭐️留言✍️🚀 🎆慢品人间烟火色,闲观万事岁月长🎆 📖希望我写的博客对你有所帮助,如有不足,请指正&#…...
备战蓝桥杯(java)(日益更新)
备战蓝桥杯(java)(日益更新) 文章目录 备战蓝桥杯(java)(日益更新)前言:一、c 到 java 须要注意的地方:二、多练java代码:(用java代码…...
06 Php学习:字符串
PHP 中的字符串变量 在 PHP 中,字符串是一种常见的数据类型,用于存储文本数据。字符串变量可以包含字母、数字、符号等字符,并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息: 定义字符串变量࿱…...
python画图Matplotlib和Seaborn
python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…...
一体式I/O模块与RS485串口联动,实现工业网络无缝对接
在现代工业自动化领域中,一体化I/O模块和RS485串口的联动应用已经成为实现工业设备高效、稳定通信的关键技术手段之一。这种联动机制能够有效地将各种现场设备的数据实时、准确地传输到上位机系统,从而实现工业网络的无缝对接。 一体化I/O模块ÿ…...
如何在Uniapp真机中使用H.265无插件流媒体播放器EasyPlayer
流媒体播放器EasyPlayer是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版,以及js版,其中js版本作为网页播放器,受到了用户的广泛使…...
【MySQL数据库 | 第二十五篇】深入探讨MVCC底层原理
前言: 在当今互联网时代,数据库扮演着数据存储和管理的关键角色。对于大型Web应用程序和企业级系统而言,高效地处理并发访问和事务管理是至关重要的。多版本并发控制(MVCC)是一种数据库事务处理的技术,旨…...
【LAMMPS学习】八、基础知识(1.6) LAMMPS 与其他代码耦合
8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...
ArrayList中多线程的不安全问题
ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出,是一种函数是接口,我们先过个耳熟 Arrys.asList是返回一个ArrayL…...
ALTER TABLE 之 定点变更(in-place alter)
定点变更算法可以提供优于慢速变更算法的诸多性能优势: 定点变更算法: 1,增加了表的可用性 ALTER TABLE操作使用定点变更算法时,其他用户稍后可以访问该表,因为数据库服务器只在更新表定义和重建包含更改列的索引时才锁…...
【RAG实践】Rerank,让大模型 RAG 更近一步
RAGRerank原理 上一篇【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人 我们介绍了什么是RAG,以及如何基于LLaMaIndex和Qwen1.5搭建基于本地知识库的问答机器人,原理图和步骤如下: 这里面主要包括包括三个基本步骤&#…...
私有化客服系统:在线客服搭建与部署的创新之路
随着互联网技术的飞速发展,企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代,一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…...
VM-UNet: Vision Mamba UNet for Medical Image Segmentation
VM-UNet: Vision Mamba UNet for Medical Image Segmentation VM-UNet:基于视觉Mamba UNet架构的医学图像分割 论文链接:http://arxiv.org/abs/2402.02491 代码链接:https://github.com/JCruan519/VM-UNet 1、摘要 文中利用状态空间模型SS…...
面向对象编程:在Python中的面向对象编程奥秘
面向对象编程在Python中的奥秘 在编程的世界里,面向对象编程(Object-Oriented Programming,简称OOP)是一种非常重要的编程范式。它改变了我们思考问题和设计代码的方式。Python作为一种支持面向对象的语言,为我们提供…...
考研数学|零基础100分保底复习方案+资料分享
目标100分其实很好实现,只要你有决心,不需要去看任何人的学习技巧 其实基础差,你只要专攻基础就好了,现在的很多考研课程和资料真的很不照顾基础不好的同学,好像就默认你什么都会一样,但是还是有对于基础差…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
react更新页面数据,操作页面,双向数据绑定
// 路由不是组件的直接跳转use client,useEffect,useRouter,需3个结合, use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
解决MybatisPlus使用Druid1.2.11连接池查询PG数据库报Merge sql error的一种办法
目录 前言 一、问题重现 1、环境说明 2、重现步骤 3、错误信息 二、关于LATERAL 1、Lateral作用场景 2、在四至场景中使用 三、问题解决之道 1、源码追踪 2、关闭sql合并 3、改写处理SQL 四、总结 前言 在博客:【写在创作纪念日】基于SpringBoot和PostG…...
