C++ 17 允许在 for 循环,if 语句,switch 语句中初始化变量

看到 c++ 有这个特性,python 和 java 似乎都没有,根据 AI 的回答进行了一些整理总结。

文章目录

    • **1. 在 `for` 循环中初始化变量**
      • **特点**
      • **多个变量初始化**
    • **2. 在 `if` 语句中初始化变量(C++17 及以上)**
      • **示例**
      • **特点**
    • **3. 在 `switch` 语句中初始化变量(C++17 及以上)**
      • **特点**
    • **4. `while` 语句不支持变量初始化**
    • **5. `for` 语句的尾端变量初始化(C++17)**
      • **特点**
    • **6. C++17 变量初始化的优势**
    • **7. 总结**
      • ✅ **适用的语法(C++17 及以上)**
      • ✅ **C++17 变量作用域优化的好处**

在 C++ 中,允许在 for 循环和 if 语句、switch 语句中初始化变量,这是 C++17 引入的一项重要特性,称为 “语句作用域变量”

这不仅提高了代码的可读性,还能减少变量的作用域,避免不必要的变量污染。

1. 在 for 循环中初始化变量

for 语句的第一部分,我们通常用它来初始化循环变量

for (int i = 0; i < 5; i++) {std::cout << i << " ";
}

特点

  • int i = 0; 作用域仅限于 for 语句,不会影响外部作用域。
  • i 在循环结束后不可用
    std::cout << i;  // ❌ 错误:i 在此作用域不可见
    

多个变量初始化

for (int i = 0, j = 10; i < j; i++, j--) {std::cout << "i = " << i << ", j = " << j << std::endl;
}

特点:

  • ij 作用域仅限于 for 语句,在 for 之外不可见。
  • 适用于两个变量协同控制循环

2. 在 if 语句中初始化变量(C++17 及以上)

C++17 允许在 if 语句中初始化变量,使变量的作用域仅限于该 if 语句及其 else 块,避免污染外部作用域。

示例

if (int x = 10; x > 5) { // 在 if 语句中声明 xstd::cout << "x is greater than 5: " << x << std::endl;
} else {std::cout << "x is 5 or less: " << x << std::endl;
}// std::cout << x; // ❌ 错误:x 在此作用域不可见

特点

  • x 只在 ifelse 块内有效,超出作用域后会被销毁
  • 避免变量作用域污染,提高代码安全性

3. 在 switch 语句中初始化变量(C++17 及以上)

C++17 也允许在 switch 语句的条件部分声明变量:

switch (int n = 3; n) {case 1: std::cout << "n is 1"; break;case 3: std::cout << "n is 3"; break;default: std::cout << "Unknown"; break;
}// std::cout << n; // ❌ 错误:n 作用域仅限于 switch 语句

特点

  • n 仅在 switch 语句内有效。
  • 避免全局变量的作用域污染

4. while 语句不支持变量初始化

不同于 ifswitchwhile 不支持 while (int x = 5; x > 0) 这样的写法:

// ❌ 错误:C++ 不允许 while 语句中初始化变量
while (int x = 10; x > 0) { std::cout << x << std::endl;x--; // 变量 x 在每次循环都会被重新初始化为 10
}

正确的做法

int x = 10;
while (x > 0) {std::cout << x << std::endl;x--;
}

5. for 语句的尾端变量初始化(C++17)

C++17 允许在 for 语句的条件部分和更新部分声明变量:

for (int i = 0; bool condition = (i < 5); int j = i * 2, i++) {  std::cout << "i = " << i << ", j = " << j << std::endl;
}

特点

  • bool condition = (i < 5); 在循环条件部分初始化变量
  • int j = i * 2, i++ 在更新部分初始化变量
  • 变量 conditionj 作用域仅限于 for

6. C++17 变量初始化的优势

传统写法C++17 写法
变量在 if 语句外部定义,可能影响其他代码变量的作用域被限制,仅限 if 语句内
可能无意间修改变量,导致难以调试的错误避免变量作用域污染,提高可读性
switch 语句必须在外部定义变量switch 语句可以直接在表达式部分定义变量
for 只能在初始化部分声明变量for 语句的 条件部分和更新部分 也能声明变量

7. 总结

适用的语法(C++17 及以上)

if (初始化变量; 条件) { ... }
switch (初始化变量; 变量) { ... }
for (初始化变量; 条件; 更新部分) { ... }

不能用于 whiledo-while

C++17 变量作用域优化的好处

  1. 避免作用域污染:变量仅在 if / switch / for 内部有效。
  2. 提升可读性:减少不必要的外部变量声明,使代码更紧凑。
  3. 减少不必要的变量声明,提高代码简洁度。

这项特性在 C++17 之后 非常实用,让代码更现代化,减少潜在的变量作用域污染!🚀

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

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

相关文章

【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)

【【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置) 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前…

分享一个常用的命名规则和Spring的命名风格

目录 Spring 命名风格规范总结表 常用代码命名单词&#xff08;通用且专业&#xff09; 命名技巧 一、返回布尔值的方法 二、条件执行方法 三、异步处理方法 四、回调方法 五、集合操作方法 六、状态校验方法 七、对象生命周期方法 八、数据操作方法 Spring 命名风格规…

【Golang学习之旅】Go-zero + Gen:如何使用 Gen 提升 Go 开发效率

文章目录 前言一、Go-zero简介二、Gen工具简介2.1 Gen的功能与特点2.2 Gen的工作原理 三、Go-zero Gen&#xff1a;结合的优势3.1为什么选择Go-zero与Gen3.2 Gen的代码生成与Go-zero的结合点 四、实际案例&#xff1a;Go-zero Gen的应用4.1 构建一个用户管理系统4.2 定义Gen配…

软件工程----统一过程模型RUP

统一过程RUP是一种以用例驱动、以体系结构为核心、迭代和增量的软件开发过程&#xff0c;由UML方法和工具支持&#xff0c;广泛应用于各类面向对象项目。 RUP本身支持可裁剪性&#xff0c;可应付给类领域软件和不同的项目规模 RUP蕴含了大量优秀的实践方法&#xff0c;如&…

48V电气架构全面科普和解析:下一代智能电动汽车核心驱动

48V电气架构&#xff1a;下一代智能电动汽车核心驱动 随着全球汽车产业迈入电动化、智能化的新时代&#xff0c;传统12V电气系统逐渐暴露出其无法满足现代高功率需求的不足。在此背景下&#xff0c;48V电气架构应运而生&#xff0c;成为现代电动汽车&#xff08;EV&#xff09…

图数据库 | 24、如何进行正确性验证?

图数据库计算和查询结果的正确性&#xff0c;这个重要性当然是不言而喻的&#xff01; 老夫之前也写文章讲过&#xff0c;今天再手书一篇&#xff0c;旨在向大家系统地介绍一下图数据库查询与计算到底如何进行正确性验证&#xff01;&#xff01;&#xff01; 图数据库中的操…

Rust ~ Vec<u8>和[u8]

Vec<u8> 和 &[u8] 是两种不同的数据类型&#xff0c;它们都与字节序列相关&#xff0c;但在所有权、内存管理、使用场景等方面存在明显区别 类型本质 Vec<u8>&#xff1a;Rust 中的动态数组类型&#xff0c;即向量&#xff08;vector&#xff09;。它是一个拥…

MYSQL学习笔记(十):约束介绍(如:非空、唯一、主键、外键、级联、默认、检查约束)

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇讲解“约束”&#xff0c;如&#xff1a;非空、唯一、主键、外键、级联、默认…

树莓百度百科更新!宜宾园区业务再添新篇

树莓集团宜宾园区业务不断拓展&#xff0c;主要体现在以下几个方面&#xff1a; 产业布局 -聚焦数字经济核心领域&#xff1a;涵盖软件开发、人工智能、大数据等&#xff0c;吸引众多上下游企业入驻&#xff0c;形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…

Halcon 学习之路 set_grayval 算子

gen_imag_const 创建灰度图像 gen_image_const(Image&#xff0c;Type&#xff0c;Width&#xff0c;Height) 算子gen_image_const创建指定大小的图像&#xff0c;图像的宽度和高度由Width和Height决定 Type 像素类型 byte :每像素1字节&#xff0c;无符号&#xff08;0-255&…

03_pyqt5 + vlc 实现视频播放器

1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…

Java 网络编程(二)—— TCP流套接字编程

TCP 和 UDP 的区别 在传输层&#xff0c;TCP 协议是有连接的&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 而UDP 协议是无连接的&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有连接和无连接的区别是在进行网络通信的时候&#xff0c;…

MySQL 事务笔记

MySQL 事务笔记 目录 事务简介事务操作事务四大特性并发事务问题事务隔离级别总结 事务简介 事务&#xff08;Transaction&#xff09;是数据库操作的逻辑单元&#xff0c;由一组不可分割的SQL操作组成。主要用于保证&#xff1a; 多个操作的原子性&#xff08;要么全部成功…

GPT1 与 GPT2 的异同

1.什么是GPT1&#xff1a; GPT1介绍了一种通过生成式预训练&#xff08;Generative Pre-Training&#xff09;来提升语言理解能力的方法。这种方法首先在一个大型的未标注文本语料库上进行语言模型的预训练&#xff0c;然后针对具体的任务进行判别式微调&#xff08;discrimin…

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。 一、音频链路 1、模拟音频信号 可以看到在传统的…

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…

DeepSeek基础之机器学习

文章目录 一、核心概念总结&#xff08;一&#xff09;机器学习基本定义&#xff08;二&#xff09;基本术语&#xff08;三&#xff09;假设空间&#xff08;四&#xff09;归纳偏好&#xff08;五&#xff09;“没有免费的午餐”定理&#xff08;NFL 定理&#xff09; 二、重…

【jira】用到几张表

jira用到的几张表 测试计划&#xff0c;测试周期&#xff0c;测试用例&#xff0c;问题记录 1. 测试计划 # 记录表&#xff0c;查计划详情 SELECT ID,issuenum,SUMMARY FROM jiraissue where issuenum 22871# 测试计划下&#xff0c;测试周期&#xff0c;查测试周期id&…

Mysql 死锁场景及解决方案

一、常见死锁场景 1. 不同顺序的锁获取 场景&#xff1a;事务A按顺序更新 行1 → 行2&#xff0c;事务B按 行2 → 行1 顺序更新。 原因&#xff1a;双方各持有一把锁&#xff0c;同时请求对方持有的锁&#xff0c;形成循环等待。 2. 索引缺失导致锁升级 场景&#xff1a;更…