【C++基础】运算符和流程控制语句

news2025/9/21 20:14:17

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 0016

cout << 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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务架构下的配置管理:Go 语言与 YAML 的完美结合

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在微服务架构盛行的今天&#xff0c;每个服务都是独立部署的实体&#xff0c;它们通常拥有各自的配置需求。应用程序配置文件扮演…

FPN(Feature Pyramid Network)详解

文章涉及个人理解部分&#xff0c;可能有不准确的地方&#xff0c;敬请指正 0. 概述 FPN&#xff0c;全名Feature Pyramid Networks&#xff0c;中文称为特征金字塔网络。它是2017年cvpr上提出的一种网络&#xff0c;主要解决的是目标检测中的多尺度问题。FPN通过简单的网络连…

【Android】【root remount】【3】remount 文件详细信息获取

前言 我们在root & remount 设备后&#xff0c;push相关文件到systm 、vendor、product 等目录进行调试&#xff0c;那么我们push的文件被保存在什么地方呢&#xff1f; 以及我们FWS、app侧如何过去push 的文件信息呢&#xff1f; remount push 文件保存 push 文件保存的…

【汇编语言实战】输入2个整数求最大公约数

C语言描述该程序流程&#xff1a; //辗转相除法 #include <stdio.h> int main() {int a,b;scanf("%d %d",&a,&b);while(a-b!0){if(a>b){aa-b;}else{bb-a;}}printf("%d",a); }汇编语言&#xff1a; include irvine32.inc .data a dword …

rk3588开发板ubuntu系统下安装ftp服务器及windows客户端建立连接

出发点:两台主机之间通过ftp进行文件传输 一.服务端安装 在FileZilla官网上找到服务端版本: 支持x86-64 查询rk3588的芯片架构: uname -m 芯片架构为aarch64,因此该软件不支持。 更换为:vsftpd 操作步骤为: 1)安装:sudo apt install vsftpd 2)启动:sudo syste…

DataX 数据库同步部分源码解析

在工作中遇到异构数据库同步的问题,从Oracle数据库同步数据到Postgres&#xff0c;其中的很多数据库表超过百万&#xff0c;并且包含空间字段。经过筛选&#xff0c;选择了开源的DataXDataX Web作为基础框架。DataX 是阿里云的开源产品&#xff0c;大厂的产品值得信赖&#xff…

Day1 省选衔接题 思路总结

Day1 省选题 思路 取数 可反悔的贪心。我们开一个双向链表记录此时每个数的前/后一个数是什么。一个简单但不一定正确的贪心策略即为&#xff1a;每次都取走当前值最大的且可取的数&#xff0c;并更新列表。考虑如何使这个贪心思路正确。 设 p r e x pre_x prex​ 表示 x x …

【Java基础题型】逆序输出字符串

将一个字符串str的内容颠倒过来&#xff0c;并输出。str的长度不超过100个字符。 输入格式 输入包括一行。 第一行输入的字符串。 输出格式 输出转换好的逆序字符串。 样例输入 I am a student 样例输出 tneduts a ma I 涉及较有意思的知识点&#xff1a; &#xff08;…

el-table合计行添加按钮操作

针对于el-table中合计功能中的操作栏也可以按钮&#xff0c;并且可以添加点击事件 ElTable源码里footer部分是&#xff0c;这种方式渲染的&#xff0c;也就是 支持传递VNode。使用h第一个参数传递 组件&#xff0c;可以把组件转成VNode&#xff0c;比如现在要在右下角加一个 详…

打卡--MySQL8.0 四 (索引及执行计划)

一、索引的创建与使用 1、索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 &#xff08;1&#xff09;从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 &#xff08;…

Redis(持久化 -- RDB AOF)

持久化 通常我们认为持久化为: 重启进程/重启主机之后, 数据仍然存在不丢失 把数据存储在硬盘上 – 持久 把数据存储在内存中 – 不持久 Redis 持久化 redis 是一个内存数据库, 也就是说本身是不持久的(但是快[效率高]), 于是 Redis 提供了持久化机制 — RDB 和 AOF 二者都是对…

day55 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1 300 最长递增子序列 题目链接 300 最长递增子序列 题意 找到整数数组nums的最长严格递增子序列的长度&#xff08;子序列并不改变原始的顺序&#xff0c;但是可以删除元素&#xff09; 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i] 表示以nums[i…

SRIO学习(1)SRIO介绍以及IP核详解

文章目录 一、SRIO介绍1.1、概要1.2、RapidIO与传统嵌入互连方式的比较1.3、串行RapidIO协议&#xff08;SRIO&#xff09; 二、RapidIO协议结构及包格式2.1、逻辑层2.2 传输层2.3 物理层 三、IP核详解3.1、逻辑层3.1.1 I/O端口3.1.2 消息&#xff08;Message&#xff09;端口3…

Linux操作系统上启动redis服务

一、下载安装redis 网上找教程。 二、修改redis.conf配置文件 1.先进入redis目录 2. ls查看文件 3.修改redis.conf中的配置&#xff0c;将daemonize no改成daemonize yes。 输入指令进行修改修改 vi redis.conf 保存退出。 三、启动redis服务 在下载的redis目录下执行以…

卷积通用模型的剪枝、蒸馏---剪枝篇(此处以deeplabv3+为例,可根据模型自行定制剪枝层)

之后的两篇文章是对前段时间工作的一个总结。 一、环境配置 1.1、文章以b导的代码为模板,环境配置比较简单(第二篇蒸馏篇结束后会放置剪枝蒸馏配置好的百度网盘链接),其他算法自行配置,在剪枝之前,需要保证算法能够在本地跑通。 B导链接: https://github.com/bubbliiiin…

分享 GoLand 2024.1 激活的方案,支持JetBrains全家桶

大家好&#xff0c;欢迎来到金榜探云手&#xff01; GoLand 公司简介 JetBrains 是一家专注于开发工具的软件公司&#xff0c;总部位于捷克。他们以提供强大的集成开发环境&#xff08;IDE&#xff09;而闻名&#xff0c;如 IntelliJ IDEA、PyCharm、和 GoLand等。这些工具被广…

串的存储结构

串其实是一种特殊的线性表&#xff0c;用什么样的存储结构实现线性表就可以类似的用什么样的方法实现串 一、串的顺序存储 1.静态数组&#xff08;定长顺序存储&#xff09;&#xff1a; //定义一个静态数组实现#define MAXLEN 255 //预定义最大串长为255 typedef st…

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

【智能算法】火鹰优化算法(FHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;M Azizi等人受到自然界火鹰狩猎行为启发&#xff0c;提出了火鹰优化算法&#xff08;Fire Hawk Optimizer, FHO&#xff09;。 2.算法原理 2.1算法思想 FHO使用特殊的控制和捕…

DepthFormer论文详解

摘要 本文旨在解决有监督单目深度估计的问题&#xff0c;我们从一项细致的试点研究开始&#xff0c;以证明远程相关性对于准确的深度估计至关重要。我们建议使用Transformer以有效地注意力机制对这种全局上下文进行建模。我们还采用一个额外的卷积分支来保留局部信息&#xff0…