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

C++ primer plus 第五节 循环

系列文章目录

C++ primer plus 第一节 步入C++-CSDN博客
C++ primer plus 第二节 hello world刨析-CSDN博客
C++ primer plus 第三节 数据处理-CSDN博客
C++ primer plus 第四节 复合类型-CSDN博客


文章目录

系列文章目录

文章目录

前言

一  for循环

总结


前言

由于作者看了后面的内容,觉得只要有点深入学过C语言就可以知道,所以这里就直接讲述一点,下一节直接讲述面向对象


一  for循环


  1  for循环关键词
for循环后面跟了一个括号像一个函数的调用,但是for在C++里面已经定义为一个关键词了,所以编译器不会把他当作一个函数来看待,这还可以防止将函数名字命名为for
 

  2  C++新增的语法规则

int x;
int y;
int z;
x = y = z = 0;

这种方法可以快速的将若干个变量设置为相同的值
 

3  表达式和语句
在我们之前学习C语言的时候基本都是见到的为明显的表达式

👉1   明显表达式
22+27这个一般都知道为49

👉2   不明显表达式
一般都是由两个值和一个运算符号组成
x = 20
这个就是表示20
maids = (cooks = 4) + 3;
这个maids为7
虽然这个不常见,但是我们也需要直到,接下来我们用vm来验证一下

我们可以看到这个(x=100)是可以给x赋值的,然后就是我们使用了ios_base::boolaplose来把这个0与1转换为bool类型买这个是可以设置的

👉3  有副作用的表达式
- 例子:++x + 15
- 解释:++x`表示将x的值加1,然后返回新的值。因此,++x + 15不仅计算了一个结果(x + 15),还改变了x的值(x被加1)这种改变就是副作用

4  副作用和顺序点
1  副作用和顺序点的定义:
副作用指的是在计算表达式时对某些东西(如存储在变量中的值)进行了修改
顺序点是程序执行过程中的一个点,在这里,进入下一步之前将确保对所有的副作用都进行了评估,在C++中,语句中的分号就是一个顺序点,这个副作用一般我们见到的就是++或者--
顺序点是有助于阐明后缀递增是何时进行
,例如,看下面的代码

while(guest++<10)cout<< guest <<endl;

这个是可以从x打印到10的循环

但是这种顺序点弄的表达式会有些许问题,就比如
y = (4 + x++) + (6 + x++)
这个表达式就是根据顺序点进行书写的
由于副作用的执行顺序不确定,这段代码可能产生未定义行为(Undefined Behavior)

例如:假设初始时 X = 1
- 如果编译器先计算 (4 + X++),此时X为1,结果为5,然后X变为2
- 接着计算 (6 + X++),此时X为2,结果为8,然后X变为3
- 最终结果为 5 + 8 = 13

但编译器也可以这样执行
- 先计算 (4 + X++) 和 (6 + X++),此时X为1,两个子表达式的结果分别为5和7
- 然后统一将X增加2(因为有两个X++),最终X为3
- 最终结果为 5 + 7 = 12

✅理解
由于C++标准没有规定副作用的具体执行顺序,因此这种代码的输出是不确定的,属于未定义行为所以C++文档中就不再用顺序点这个东西了,由于++和--这个两个有确定性,不可具体的描述

5  前缀格式和后缀格式

#include<iostream>
using namespace std;int main() {for (int i = 1;i <= 10;++i) {cout << i << " " ;}cout << endl;for (int i = 1;i <= 10;i++) {cout << i << " ";}cout << " ";return 0;
}

我们来看这个for循环步长表达式
这两个打印的都是一样的,但是,其实这两个还是有很大的差别的

👉(1)语义区别
- ++i(前缀递增):先将i的值增加1,然后返回增加后的值
- i++(后缀递增):先返回i的当前值,然后将i的值增加1
在`for`循环的迭代部分(如++i或i++),这种区别通常不会影响循环的逻辑,因为它们都被用来更新循环变量i,而循环条件是基于i的值来判断的

👉(2)效率区别
- ++i:直接返回增加后的值,没有额外的临时变量
- i++:需要返回i的当前值,然后增加i的值。这意味着编译器可能需要创建一个临时变量来存储i的当前值,从而导致一些额外的开销
在简单类型(如`int`)的情况下,这种开销通常可以被编译器优化掉,因此在实际运行中可能看不出效率差异。但在复杂类型(如自定义类或迭代器)的情况下,i++可能会比++i更慢,因为i++需要创建一个临时对象来存储当前值

6  逗号运算符号
👉用途一:用于for循环的步长表达式
for(int i = 1; i<n ; i++,j--)
这个就是逗号运算符号的用途,可以用于这个步长表达式
这个实际用的比较多的地方是把数组里面的值进行互换顺序,这个就比较常用

👉用途二:确保表达式的安全性
C++给这个运算符号添加了一个特性就是,它确保先计算第一个表达式,然后计算第二个表达式(换句 话说,逗号运算符是一个顺序点)
i = 20,j = 2 * i先处理 i,再处理 j 

👉用途三:逗号表达式的值是第二部分的值
cat = 17,240;
是被解释为`(cat = 17),240`
这个就是把cat存储17,后面的240不起任何作用
(cat = 17,240)
这个由于括号的优先级别最高,所以cat是240
根据用途二可以这么解释
✅第一个表达式
步骤1:先计算cat = 17。这会将`cat`的值设置为17,并且cat = 17的值也是17
步骤2:然后计算240。240是一个独立的表达式,它的值是240

✅第二个表达式
步骤1:先计算cat = 17。这会将cat的值设置为17,并且cat = 17的值是17
步骤2:然后计算240。240是一个独立的表达式,它的值是240
结果:逗号表达式的值是240,因为逗号表达式的值是最后一个子表达式的值
最终结果:由于整个表达式被括号包围,它的值是240。因此,cat的值最终被设置为240


总结

这里的循环章节就没有全部写完了,博主看了一下后面,其实是一些不常用的,等到开发阶段遇到那些问题再来学也没问题,我们下一节直接启动类与面向对象

我们学习
for循环的关键词语
新增语法
明显表达式和不明显表达式
副作用表达式
副作用和顺序点的概念
前缀与后缀的效率在for循环与不同点
逗号运算符的作用

http://www.lryc.cn/news/544849.html

相关文章:

  • 使用Hydra进行AI项目的动态配置管理
  • .bash_profile一些笔记
  • 数据虚拟化的中阶实践:从概念到实现
  • MongoDB安全管理
  • [STM32]从零开始的STM32 DEBUG问题讲解及解决办法
  • 创建Order项目实现Clean Hexagonal架构
  • 【算法】图论 —— Floyd算法 python
  • YOLOv5 + SE注意力机制:提升目标检测性能的实践
  • 基于fast-whisper模型的语音识别工具的设计与实现
  • python中单例模式应用
  • 鸿蒙HarmonyOS 开发简介
  • 2. 在后端代码中加入日志记录模块
  • Linux软硬链接
  • Kali换源
  • Java 大视界 -- Java 大数据机器学习模型的可解释性增强技术与应用(107)
  • SYN Flood的攻击原理及防御
  • Javaweb数据库多表查询 内连接 外连接 子查询
  • 绕过 RAG 实时检索瓶颈,缓存增强生成(CAG)如何助力性能突破?
  • Nginx系列09(Nginx 与其他服务集成、实战项目)
  • nvidia驱动更新,centos下安装openwebui+ollama(非docker)
  • 手机端抓包大麦网抢票协议:实现自动抢票与支付
  • Vue3实现文件上传、下载及预览全流程详解(含完整接口调用)
  • 普通人高效使用DeepSeek指南?
  • 基于JAVA+Spring+mysql_快递管理系统源码+设计文档
  • 《从0到1:用Python在鸿蒙系统开发安防图像分类AI功能》
  • 第十四届蓝桥杯大赛软件赛国赛C/C++大学C组
  • 黑龙江省地标-DB31/T 862-2021 “一网通办”政务服务中心建设和运行规范
  • 基于SpringBoot的美妆购物网站系统设计与实现现(源码+SQL脚本+LW+部署讲解等)
  • 如何评估所选择的PHP后端框架的性能?
  • 快速搭建多语言网站的 FastAdmin 实践