当前位置: 首页 > news >正文

【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操作,一般右移是补符号位

在这里插入图片描述
移位运算符的运算规则如下:

  1. 较小的整数类型(char、short以及bool)会自动提升成int类型再做移位,得到的结果也是int类型
  2. 左移运算符<<将操作数左移之后,在右侧补0;
  3. 右移运算符>>将操作数右移之后,对于无符号数就在左侧补0;对于有符号数的操作则要看运行的机器环境,有可能补符号位,也有可能直接补0;
  4. 由于有符号数右移结果不确定,一般只对无符号数执行位移操作;

这里解释一下为什么有符号数右移结果不确定,这主要有两个原因:① 有符号数在进行右移动是补的数据是1还是0要根据该数据是正数还是负数来定,正数补0,负数补1② 相同的数据类型在不同的机器环境上的位数是不同的,可能在机器1上的定义正数转移到机器2上就被理解为负数。

2.2 位逻辑运算符

计算机存储的每一个位(bit)都是二进制的,有0和1两种取值,这跟布尔类型的真值表达非常类似。于是自然可以想到,两个位上的0或1都可以执行类似逻辑运算的操作。位逻辑运算符有:按位取反~,位与&,位或|和位异或^

  1. 按位取反~:一元运算符,类似逻辑非。对每个位取反值,也就是把1置为0、0置为1;
  2. 位与&:二元运算符,类似逻辑与。两个数对应位上都为1,结果对应位为1;否则结果对应位为0;
  3. 位或|:二元运算符,类似逻辑或。两个数对应位上只要有1,结果对应位就为1;如果全为0则结果对应位为0;
  4. 位异或^:两个数对应位相同,则结果对应位为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++编译器可以自动对类型进行转换,不需要我们干涉,这种方式叫做隐式类型转换。隐式类型转换主要发生在算术类型之间,基本思路就是将长度较小的类型转换成较大的类型,这样可以避免丢失精度。隐式类型转换不仅可以在变量赋值时发生,也可以在运算表达式中出现。

隐式类型转换的一般规则可以总结如下:

  1. 在大多数算术运算中,较小的整数类型(如bool、char、short)都会转换成int类型。这叫做整数提升;
  2. 当表达式中有整型也有浮点型时,整数值会转换成相应的浮点类型;
  3. 在条件判断语句中,其它整数类型会转换成布尔类型,即0为false、非0为true;
  4. 初始化变量时,初始值转换成变量的类型;
  5. 在赋值语句中,右侧对象的值会转换成左侧对象的类型;

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++中要想进行强制类型转换,主要有以下三种方式:

  1. C语言风格:(类型名称) 值
  2. C++函数调用风格(推荐):类型名称 (值)
  3. 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. 注意

  1. 要尽量避免将较大类型的值赋给较小类型的变量,这样很容易出现精度丢失或者数据溢出。
  2. 如果希望判断一个整型变量a是否在某个范围(0, 100)内,不能直接写:0 < a < 100;由于小于运算符<满足左结合律,要先计算0 < a,得到一个布尔类型的结果,再跟后面的100进行比较。此时布尔类型做整数提升,不管值是真(1)还是假(0),都会满足 < 100 的判断,因此最终结果一定是true。要想得到正确的结果,需要将两次关系判断拆开,写成逻辑与的关系。

二、流程控制语句

1. C++和Java在通用流程控制语句中的不同之处对比

语句C++Java
switchC++中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 显式类型转换&#xff08;强制类型转换&#xff09; 4. 注意 二、流程控制语句1. C和Java在通用流程…...

AOF文件重写

1.2.3.AOF文件重写 因为是记录命令&#xff0c;AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作&#xff0c;但只有最后一次写操作才有意义。通过执行bgrewriteaof命令&#xff0c;可以让AOF文件执行重写功能&#xff0c;用最少的命令达到相同效果。 如图&am…...

第四次面试总结 — 嘉和智能 - 全栈开发

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ&#xff1b;) 专栏 —— 本人真实面经&#xff0c;更多真实面试经验&#xff0c;中大厂面试总结等您挖掘 目录 总结&#xff08;非详细&#xff09; 面试内…...

tx-lcn使用

tx-lcn是啥 tx-lcn是一个分布式事务框架&#xff0c;有两个模块组成管理端&#xff08;server&#xff09;和client端。 管理端用于分布式事务的注册&#xff0c;事务消息接收&#xff0c;事务消息下发等管理工作。 client端包括事务发起方&#xff0c;事务参与方。 LCN名称是…...

oracle恢复异常处理

问题现象&#xff1a; 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

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…...

备战蓝桥杯(java)(日益更新)

备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09; 文章目录 备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09;前言&#xff1a;一、c 到 java 须要注意的地方&#xff1a;二、多练java代码&#xff1a;&#xff08;用java代码…...

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…...

python画图Matplotlib和Seaborn

python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…...

一体式I/O模块与RS485串口联动,实现工业网络无缝对接

在现代工业自动化领域中&#xff0c;一体化I/O模块和RS485串口的联动应用已经成为实现工业设备高效、稳定通信的关键技术手段之一。这种联动机制能够有效地将各种现场设备的数据实时、准确地传输到上位机系统&#xff0c;从而实现工业网络的无缝对接。 一体化I/O模块&#xff…...

如何在Uniapp真机中使用H.265无插件流媒体播放器EasyPlayer

流媒体播放器EasyPlayer是TSINGSEE青犀流媒体组件系列中关注度较高的产品&#xff0c;经过多年的发展和迭代&#xff0c;目前已经有多个应用版本&#xff0c;包括RTSP版、RTMP版、Pro版&#xff0c;以及js版&#xff0c;其中js版本作为网页播放器&#xff0c;受到了用户的广泛使…...

【MySQL数据库 | 第二十五篇】深入探讨MVCC底层原理

前言&#xff1a; 在当今互联网时代&#xff0c;数据库扮演着数据存储和管理的关键角色。对于大型Web应用程序和企业级系统而言&#xff0c;高效地处理并发访问和事务管理是至关重要的。多版本并发控制&#xff08;MVCC&#xff09;是一种数据库事务处理的技术&#xff0c;旨…...

【LAMMPS学习】八、基础知识(1.6) LAMMPS 与其他代码耦合

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...

ArrayList中多线程的不安全问题

ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出&#xff0c;是一种函数是接口&#xff0c;我们先过个耳熟 Arrys.asList是返回一个ArrayL…...

ALTER TABLE 之 定点变更(in-place alter)

定点变更算法可以提供优于慢速变更算法的诸多性能优势&#xff1a; 定点变更算法&#xff1a; 1&#xff0c;增加了表的可用性 ALTER TABLE操作使用定点变更算法时&#xff0c;其他用户稍后可以访问该表&#xff0c;因为数据库服务器只在更新表定义和重建包含更改列的索引时才锁…...

【RAG实践】Rerank,让大模型 RAG 更近一步

RAGRerank原理 上一篇【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人 我们介绍了什么是RAG&#xff0c;以及如何基于LLaMaIndex和Qwen1.5搭建基于本地知识库的问答机器人&#xff0c;原理图和步骤如下&#xff1a; 这里面主要包括包括三个基本步骤&#…...

私有化客服系统:在线客服搭建与部署的创新之路

随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代&#xff0c;一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…...

VM-UNet: Vision Mamba UNet for Medical Image Segmentation

VM-UNet: Vision Mamba UNet for Medical Image Segmentation VM-UNet&#xff1a;基于视觉Mamba UNet架构的医学图像分割 论文链接&#xff1a;http://arxiv.org/abs/2402.02491 代码链接&#xff1a;https://github.com/JCruan519/VM-UNet 1、摘要 文中利用状态空间模型SS…...

面向对象编程:在Python中的面向对象编程奥秘

面向对象编程在Python中的奥秘 在编程的世界里&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种非常重要的编程范式。它改变了我们思考问题和设计代码的方式。Python作为一种支持面向对象的语言&#xff0c;为我们提供…...

考研数学|零基础100分保底复习方案+资料分享

目标100分其实很好实现&#xff0c;只要你有决心&#xff0c;不需要去看任何人的学习技巧 其实基础差&#xff0c;你只要专攻基础就好了&#xff0c;现在的很多考研课程和资料真的很不照顾基础不好的同学&#xff0c;好像就默认你什么都会一样&#xff0c;但是还是有对于基础差…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...