现代c++实践:变量声明强化,竟然可以在if/switch中定义变量!

C++ Core Guidelines:现代C++编程的核心理念与实践指南 在现代软件开发中,编写安全、高效且可维护的代码是每个开发者的核心目标。C++作为一门强大的系统级编程语言,其灵活性和性能优势也带来了资源管理、类型安全等挑战。通过理解RAII(资源获取即初始化)等核心编程范式,开发者可以构建更可靠的软件系统。C++ Core Guidelines正是基于这些理念,提供了一套系统性的编码原则,旨在消除空指针解引用、内存泄漏等常见错误。该指南不仅涵盖了智能指针、类型推导等现代C++特性,还强调了静态分析工具和代码审查在工程实践中的重要性。通过将资源管理自动化和类型安全作为基本原 阅读详情

变量声明强化,竟然可以在if/switch中定义变量!

c通过本文你可以了解

C++17新特性 变量声明强化

在if/switch 中的变量声明强化

if/switch 变量声明强化

在传统 C++ 中,变量的声明虽然能够位于任何位置,甚至于 for 语句内能够声明一个临时变量 int,但始终没有办法在 if 和 switch 语句中声明一个临时的变量。例如:

#include <iostream>
#include <vector>
#include <algorithm>
void Var_Declarat_Reinforcement() 
{
	std::vector<int> vec = { 1, 2, 3, 4 };
	// 在 c++17 之前
	const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 2);//必须提前声明
	if (itr != vec.end()) 
	{
		*itr = 3;
	}
	// 需要重新定义一个新的变量
	const std::vector<int>::iterator itr2 = std::find(vec.begin(), vec.end(), 3);
	if (itr2 != vec.end()) 
	{
		*itr2 = 4;
	}
	// 将输出 1, 4, 3, 4
	for (std::vector<int>::iterator element = vec.begin(); element != vec.end(); ++element)
	{
		std::cout << *element << std::endl;
	}		
}

在上面的代码中,我们可以看到 itr 这一变量是定义在整个 main() 的作用域内的,这导致当我们 需要再次遍历整个 std::vectors 时,需要重新命名另一个变量。

C++17 消除了这一限制,使得我们可以在 if(或 switch)中完成这一操作。、

// 将临时变量放到 if 语句内
if (const std::vector<int>::iterator itr = std::find(vec.begin(), vec.end(), 3);
itr != vec.end()) {
*itr = 4;
}

总结

这在某些情况下非常好用,可以算作C++的语法糖,非常建议使用!

但是在使用之前,你需要升级编译器到支持C++17
在这里插入图片描述

现代C++ constexpr:编译期计算与零开销抽象的核心机制 常量表达式是编程语言中能够在编译阶段完成求值的表达式,其核心原理在于编译器在生成机器码前即可确定表达式的最终结果。这一机制的技术价值在于实现“零开销抽象”,将计算从运行时转移到编译时,从而消除运行时开销、减少内存占用并启用更激进的编译器优化。在应用场景上,常量表达式广泛用于定义数组大小、模板非类型参数、编译期查找表生成以及替代宏定义常量。本文聚焦于C++中的constexpr关键字,它作为声明常量表达式的核心工具,从C++11到C++20不断演进,能力大幅扩展,现已支持动态内存分配和标准库容器等高级特性,成 阅读详情

相关推荐

C++中if/switch语句中的变量声明方式

在C++中,if/switch语句是常用的条件语句,它们可以根据特定的条件来执行相应的代码块。而在这些语句中,变量的声明方式也对于程序的性能和可读性有着很大的影响。特别是在需要频繁执行的代码块中,if/switch初始化可以减少运行时的开销,并提高程序的性能。通过本文,我们可以了解到C++17之后的if/switch变量声明强化,更加简洁优雅,且可以避免额外的内存开销。这种方式具有更好的性能和可读性,因为变量的作用范围被限制在if语句中,而且不会产生额外的内存开销。

. 924

在c++中if语句内填写一个变量会发生什么?

在c++中if语句内填写一个变量会发生什么?很多入门的人学到语句都会有这个问题,今天我就给大家解答一下。首先,我们得了解if语句是什么,下面为资料:。。。。。。

w5966的博客 1922

C++(17):if及switch初始化语句

C++17在if语句内或switch语句内完成变量的定义及初始化: 通过这种方式定义变量及其初始化,可以将变量的有效作用域限制在if或switch语句的范围内,减少外围作用域内变量的名称混淆。

风静如云的博客 1289

【C++ Primer】语句

  一、简单语句 1、使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的。 2、程序块不以分号结束(但是类要以分号结束)。二、语句作用域 1、可以在if、switch、while、for语句内定义变量(变量是临时的),在语句结束后变量就不起作用了,所以这些变量要初始化。三、条件语句 1、if语句:判断条件是否为真。     悬垂else:C++规定else与离它最近的还未配对的...

青萍之末的博客 431

c++if/switch 变量声明强化

在传统 C++ 中,变量的声明虽然能够位于任何位置,甚至于 for 语句内能够声明一个临时变量 int,但始终没有办法在 if 和 switch 语句中声明一个临时的变量。例如: #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4}; // 在 c++17 之前 const

希望我的博客,能帮上你解决学习中工作中所遇到的问题 741

C++ 条件语句和选择语句中的变量声明强化

在 C++ 中,if-else 语句和 switch 语句是常用的条件和选择语句。我们可以在这些语句中声明变量,并且这些变量的作用域仅限于其所在的语句块内部。其中,if-else 语句和 switch 语句是两种常用的条件和选择语句。在上面的示例中,变量 x 和 y 的作用域仅限于其所在的 if-else 语句块内。在上面的示例中,根据变量 value 的值,程序将执行相应的代码块并声明和使用变量 x、y 或 z。在上面的示例中,变量 x、y 和 z 的作用域仅限于其所在的 case 语句块内。

HackVibe的博客 254

C++11/14/17新特性之 - if/switch 变量声明强化,结构化绑定,一致的初始化,自动推导,if constexpr,类型别名模板

if/switch 变量声明强化 void defineVarInIfOrSwithc() { // 在if,switch中直接定义变量 vector<int> vec{1, 2, 3, 4, 5}; if (auto iter = std::find(vec.cbegin(), vec.cend(), 4);iter != vec.cend()) { cout << *iter << e

一只羊 1255

c++if语句、决策语句块和变量作用域

c++的if语句、决策语句块和变量作用域,决策语句块和变量作用域只有一些,可能不全

现代C++语言可用性强化:10个让编程更简单的关键特性

现代C++教程(modern-cpp-tutorial)是一份全面介绍C++11/14/17/20新特性的开源学习资料,旨在帮助开发者掌握现代C++的核心语法和最佳实践。本文将聚焦于语言可用性强化的10个关键特性,这些特性显著简化了代码编写,提升了开发效率,让C++编程变得更加简单直观。 ## 1. nullptr:告别NULL的模糊性 C++11引入`nullptr`关键字,专门用于表示空指

gitblog_00846的博客 484

人工智能100问☞第5问:什么是AI三要素?

人工智能的核心三要素是​​数据、算法和算力​​,分别作为AI的“燃料”、“大脑”和“动力”,三者协同驱动智能系统的学习、推理与决策能力。

bjdx_001的博客 1995

ArcGIS Pro中如何批量替换数据源

不知您是否遇到过下面情况:ArcGIS Pro的Map/Scene中所引用的数据源被移动或重命名了,导致Map/Scene中找不到之前的数据,出现红色叹号;已有一个Map模板文件,图层的样式符号都是设置好的,想批量设置成另外一个数据源,复用该模板文件中的样式符号。 如果您在ArcGIS Pro的使用过程中遇到了上面情况,那么可以参考本篇文章,本文以图层存储在同一GDB中为例介绍。 情况一:Map中已有图层的数据源被移动了 原始Map长这样: 当数据源位置改变之后,显示找不到数据源的红色叹号: 这时如果右

xinying180的博客 7949

C++17 if/switch 变量声明强化

C++17 引入了新特性,允许在if和switch语句内部定义并初始化变量,这样可以限制变量的作用域,避免在更广范围内的名称冲突。这种方式提高了代码的清晰度和安全性。

MyBigOrange的博客 371

SAC安装与相关库文件(.so)的安装

摘要 SAC: Seismic Analysis Code 是用于地震信号处理的一套软件。 本文将介绍SAC的安装,以及安装时遇到的一些问题。主要是一些动态库(lib**.so)找不到的问题。 本文的环境 64位的 Ubuntu 16.04 64位的系统是安装出现问题的主要原因 1. SAC获取与安装 SAC 的安装,只需要解压,然后修改环境变量即可!!!不需要任何编译!!! 1.1. SAC 获取与解压 SAC软件获取地址:http://ds.iris.edu/ds/nodes/dmc/forms/s.

WangCY的博客 4336

蓝桥ROS机器人之现代C++学习笔记2.2变量及其初始化

if/switch 变量声明强化 #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4}; // after c++17, can be simplefied by using `auto` const std::vector<int>::iterat...

zhangrelay的专栏 1821

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

198、影像系统设计评审流程:从需求评审到 EVT、DVT、PVT 各阶段的关注重点

本文详细介绍了影像系统从需求评审到EVT、DVT、PVT各阶段的设计评审流程及关键点。作者通过实际案例(如IMX766模组偏紫问题)强调硬件工艺的重要性,指出影像系统是功能定义与物理实现的反复拉锯过程。文章分阶段解析:需求评审需将模糊需求转化为物理参数;架构评审要明确接口定义和时序约束;EVT阶段重点关注模组一致性和基础链路;DVT阶段需平衡算法调优与硬件验证;PVT阶段则以量产一致性为核心。最后提出建立"边界条件确认表"和"健康度看板"等实用建议,强调工程师需具备从表象追溯硬件根源的物理直觉。全文贯穿实战

sundong_81的博客 218

第二章 语言可用性的强化——变量及其类型初始化

2.2 变量及其类型初始化 if/switch 变量声明强化 ​在传统C++中,可以在 for 循环内声明一个临时变量 int,但是始终没有办法再 if 和 switch语句中声明一个临时变量。C++17解除了这一限制,使我们可以在 if/switch 中完成这一操作。 std::vector<int> vec = { 1, 2, 3, 4 }; if (const vector<int>::iterator itr = std::find(vec.begin(), vec.end(

m0_46747840的博客 306

cesium实战目录必看

本文作者长期从事GIS相关工作,专注于三维和地图可视化领域,熟悉Cesium、Three.js、WebGL等开发框架。文章目录展示了作者在Cesium应用中的多项技术实践,涵盖水面反射、离屏渲染、后处理效果、地形裁剪、Shader着色器、动态单体化、气象图、缓冲区域、坡度和坡向分析、三维热力图、通视分析、态势标绘等多个方面。这些内容为开发者提供了丰富的技术参考,展示了Cesium在三维可视化中的强大功能和应用场景。

God's asylum的博客 8721

C++17新特性知识点汇总

C++17的入选特性有 非类型模板参数的 auto 模板参数分为两种,一种是类型模板参数,也是我们用得最多的一种: template <typename T, typename U> auto add(T t, U u) { return t+u; } 里面的T和U都是类型模板参数。另一种是非类型模板参数,它可以让不同的字面量成为模板的参数: template <typename T, int BufSize> class buffer_t ...

SmallBottle-CGWLMX的博客 697

[PCIe5.0] 5.3.1.4.2 D3Cold State

主电源(Vcc)完全断开,仅保留极少量辅助电源(Vaux)用于维持基本唤醒功能设备功能完全关闭,所有寄存器状态丢失(除非有特殊存储)需要完全重新初始化才能恢复工作比D3Hot状态功耗更低,但唤醒延迟更长。

系统固件工程师 453

单片机设计具备断电记忆功能的计时器

本文介绍了如何设计一款具备断电记忆功能的计时器,利用单片机和EEPROM存储器实现了计时器值的保存和恢复。当然,在实际的设计中还需要考虑其他因素,如电源管理、时钟精度等,以确保计时器的正常运行和准确性。选择合适的单片机:在设计计时器时,我们需要选择一款具备存储功能的单片机,以便在断电后能够保存计时器的状态。可以优化显示方式,使用更加直观的界面来展示计时器的值;函数中,我们首先从 EEPROM 中读取计时器的初始值,然后在一个无限循环中每秒钟增加计时器的值,并将新的值写入 EEPROM 中。

RlDart的博客 1094

在C++中如何从**编码习惯、工具使用、语法规则**等维度,系统性地避免使用未初始化的局部变量——这是新手极易踩坑的问题

核心原则:声明局部变量时立即初始化,基础类型赋0/false/nullptr,复杂类型用默认构造;工具兜底:开启编译器高警告级别(-Wall/-W4),并将警告转为错误,强制修正问题;逻辑检查:确保if-else/switch等条件分支覆盖所有情况,避免变量“逻辑上未初始化”;进阶优化:使用C++11+的统一初始化{}等特性,从语法上规避风险。遵循这些方法,能99%避免未初始化局部变量的问题,也是写出健壮C++代码的基础习惯。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 837

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++17 if/switch初始化语句:作用域控制与代码表达力的革新

在编程语言设计中,作用域管理是确保代码健壮性和可维护性的核心概念之一。传统上,变量作用域的控制依赖于代码块结构,但复杂的条件逻辑常导致变量生命周期过长,引发潜在的资源泄漏或状态污染。C++17引入的if与switch初始化语句,通过允许在条件判断前声明并初始化变量,并将其生命周期严格限定在条件块内,实现了作用域的精确定义。这一特性不仅提升了代码的安全性,减少了因变量误用导致的bug,还显著增强了代码的表达力,使“获取-检查-使用”模式更加紧凑直观。结合std::optional和智能指针等现代C++特性,它

weixin_30443813的博客 396

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++11新标准

新类型C++11新增了类型 long long 和 unsigned long long,以支持64位(或更宽)的整型;新增了类型 char16_t和 char32_t,以支持 16位和 32 位的字符表示;还新增了“原始”字符串。

weixin_45766539的博客 947

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

现代C++11/14/17

读完本专栏的好处:C++方面的面试不再是困难,找个好工作还是可以的。对于现代特性也可以熟练使用。项目代码无障碍阅读。以下内容会按照重要程度分级,按照星级大胆跳过就行,绝大部分你用不到。0~3星(注意,程序员的世界是从0开始计数的)0星:不知道也无所谓1星:对于刚入职场的新人这东西都不重要。如果你是新人不用看这些东西。2星:需要了解,至少能看懂。3星:需要掌握,工作百分百遇到。注意星级不是难度😀。零、正篇前杂谈。1.1、被弃用的特性。(2✳)只说实际工作中才会涉及到的内容。

qq_51496998的博客 333

c++特性之auto

c++新特性 auto

qq_62309585的博客 1119
上一篇: 现代C++实践100练:吃透C++新特性constexpr
下一篇: 现代C++实战100练:初始化列表
CodeBowl
博客等级 码龄5年 7664粉丝 67原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值