C++“靠近定义变量“之真正原因

C/C++指针声明风格解析:*号靠近类型还是变量名? 在C/C++编程中,变量声明是基础而关键的概念,它定义了数据的类型和内存布局。理解声明语法本质,需要掌握声明符与变量名的绑定规则,这直接影响代码的可读性和安全性。从技术价值看,正确的声明风格能避免多变量声明歧义、提升代码一致性,是编写健壮系统软件的基础。在嵌入式开发、操作系统内核等应用场景中,指针声明的书写规范尤为重要。本文围绕指针声明符*的书写位置,对比了靠近类型与靠近变量名两种主流风格,通过实际代码示例分析其优缺点,并强调声明符绑定变量名的核心语法规则,帮助开发者规避常见陷阱,提升代码质量。 阅读详情

在C++中,都知道要“尽量靠近变量实际使用处进行定义”。对此条规则一般的理解是:这是C++对C“函数开始处进行变量定义”的一种优化,目的是方便程序员定义和使用变量。最近学习时发现,这个规则实际上和C++“面向对象的编程语言”本质密切相关。
考虑如下的类定义和代码段:

class X
{
public:
  X() : m_number(2);
  ~X();
  void SetNumber(int number){m_number = number;};
  int GetNumber(){return m_number};
private:
  m_number;
};

int main(int argc, char* argv[])
{
  X x1;
  X x2;

  if (x1.GetNumber() == 0)
  {
    return 0; // 第一个return
  }

  if (x2.GetNumber() == 2)
  {
    return 0; // 第二个return
  }

  return 0; // 最后的return
}

这段代码申明了两个X的局部变量,x1和x2。如果按照C的申明方式把两个变量放在函数的开始处,那么,编译器在每个return返回处都必须对x1和x2调用析构函数。
如果把代码改成如下形式:

int main(int argc, char* argv[])
{
  X x1;
  if (x1.GetNumber() == 0)
  {
    return 0; // 第一个return
  }
  X x2;
  if (x2.GetNumber() == 2)
  {
    return 0; // 第二个return
  }

  return 0; // 最后的return
}

也就是在使用x2前才申明x2,则第一个return处编译器就不用加入对x2析构函数的调用了。

如果函数申明了比较多的对象,而且函数析构的开销比较大,则“使用前才申明”就能可观地减小代码尺寸和运行时开销。由此观之,本条规定的来源实际上是:“C++是面向对象的编程语言,编译器会插入很多编程者未书写的代码来达成面向对象语义,如果不遵循该规则,这些编译器添加的代码会造成较大的开销”。

C++中,很多似乎无关紧要的规则都有其深刻的含义,不是随便规定的。

咱们一起学C++第九十七篇:之变量定义与初始化的新视角 在C++学习的征程中,我们一同攻克了诸多知识要点,每一次的交流都如同点亮了一盏前行的明灯。现在,我们将聚焦于变量定义与初始化这一基础但又至关重要的领域。希望通过本次探讨,能帮助大家摆脱传统思维的束缚,以全新的视角理解C++在这方面的独特之处,从而让大家在编写代码时能够更加灵活、高效。让我们携手共进,继续在C++的知识宇宙中探索,共同成长,共同进步。 阅读详情

相关推荐

深入解读C++中的指针变量

指针变量是一种特殊的变量,它和以前学过的其他类型的变量的不同之处是:用它来指向另一个变量。为了表示指针变量和它所指向的变量之间的联系,在C++中用“*”符号表示指向,例如,i_pointer是一个指针变量,而*i_pointer表示i_pointer所指向的变量。 下面两个语句作用相同: i=3; *i_pointer=3; 定义指针变量 C++规定所有变量在使用前必须先定义,即指定其类型。在编译时按变量类型分配存储空间。对指针变量必须将它定义为指针类型。先看一个具体例子: int i, j; //定义整型变量i,j int *pointer

修饰符*和&应该靠近数据类型还是该靠近变量名

个人见解,这个人讲的挺对的,赞同。         C/C++的定义方式是类型 变量名; 1、如果是int *p;那么*p才是变量。p比较不容易理解是指向一个变量地址的指针(除非很习惯)。突出了*p是int类型的,再想到p是指针。但如果是int* p;其实更容易理解p就是指向一个int类型的指针。突出p就是指针。而取内容*p是int类型的。 2、char* a; int* b; 可以知道a,b...

humeApz的博客 2854

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1755

C/C++中的指针*是靠近数据类型还是靠近数据变量书写?

C/C++中的指针*是靠近数据类型还是靠近数据变量? 在C/C++中,指针尤为重要,但是在书写时,*是靠近数据类型还是靠近变量数写呢? int *p; int* pi; 其实两种书写形式并无本质不同,编译器都会认为是正确的指针变量; 第一种书写形式我们可以理解为指针p是int类型的 第二种书写形式我们可以理解为pi是int类型的指针变量 虽然耳针本质并无不同,但是在一天语句中进行多变量声明时,第二种书写形式容易产生误解。 例如: int* p, q; 这条语句很容易理解为p和q都是int类型的指针变

weixin_42133358的博客 2544

一个Android应用层开发如何转型深入Android Framework?

不知何时起,单纯的Android应用层开发越来越少了,主流技术演变也越来越快,从之前的rxjava到如今的协程,从之前MVC到如今的MVVM,还有Flutter、Compose等技术,可以说是日新月异。

m0_64420071的博客 1910

TSEND_C指令错误代码解析与实战排错指南

本文详细解析西门子PLC中TSEND_C指令的常见错误代码,包括连接建立、参数配置、资源限制和网络通信等错误类型。针对错误代码80C4等典型问题提供实战排错指南,帮助工程师快速诊断和解决工业通信中的连接故障,提升系统可靠性。

backprop5master的博客 411

C++ 中的& 符号

在c++中, &符号有几种不同的意思.1. 表示位与 2. 表示一个变量是另一个已存在变量的别名. 紧跟在变量类型后面.int i = 5;int &ri = i; // 注意是把一个变量直接复制给它的别名. //此处的&没有指针的意思, 只是用来标识一个变量是另一个 //已知变量的别名,所以是直接赋值的  

badbad_boy的专栏 2084

安装Anaconda和Labelme的教程

1 登录Anaconda官网,选择Download https://www.anaconda.com/distribution/ 2 选择你想下载的Python版本,选择你的操作系统和位数,然后点击Download按钮就开始下载了 3 开始安装 下面两个框框都勾选 点击next,等待安装成功 打开Anaconda Navigator 点击红色圈圈的按钮 在cmd中输入 (1)创建虚拟环境 conda create -n labelme python=3.6 (2)激活虚拟环境 conda activa

qq_42178122的博客 3809

代码质量-变量的作用域最小化原则与就近原则

代码质量-变量的作用域最小化原则与就近原则 一 变量的作用域 作用域或者可见性(visibility)指的是变量在程序内的可见和引用的范围。作用域可以看作是一种衡量变量的知名度的方法:它的名气有多大?一个作用域很小的变量只能在很小的范围内可见-比如说,循环下标变量只能用于一个循环的小范围内,一个作用域大的变量则在程序的很多地方都是可见的-比如说全局变量。 变量可以只对某一个代码块可见、

sureyonder的专栏 8358

ubuntu-emto-cpa 测试和使用(单核运行)

ubuntu-emto-cpa 测试和使用(单核运行)

qq_45834835的博客 1400

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1006

代码整洁之道内容概括

一个偶然的机会读了代码整洁之道,觉得这本书讲的很好就在网上找了一个pdf读了一下,并将里面觉得有道理的内容记录下来,作为自己以后写代码的标准和准则,并且建立起属于自己的代码风格。同时也为那些曾经困惑过的人一点参考吧~! 一、需求与代码哪个重要: 并不是所有的产品都能提出合理的需求,当你面对一个提出不合理需求的产品的时候,你是要遵循其不合理的需求呢?还是坚持代码的合理性? 二、易读的代码和易懂的代码

Jason的博客 6447

【Bug已解决】Failed to fetch version ECONNREFUSED 解决方案

方案适用场景推荐指数难度方案一:NODE_EXTRA_CA_CERTS代理/企业网关证书⭐⭐⭐⭐⭐低方案二:浏览器导出证书不知证书在哪⭐⭐⭐⭐中方案三:使用系统证书macOS 用户⭐⭐⭐⭐中方案四:关闭代理直连快速验证⭐⭐⭐低方案五:更新 Node.js证书列表过时⭐⭐⭐低方案六:同步系统时间时间偏差导致⭐⭐⭐低根本原因。

博客 9973

【C++】[转]“靠近定义变量”之真正原因

 [转至]http://hi.baidu.com/nianhuaxpj 在C++中,都知道要“尽量靠近变量实际使用处进行定义”。对此条规则一般的理解是:这是C++对C“函数开始处进行变量定义”的一种优化,目的是方便程序员定义和使用变量。最近学习时发现,这个规则实际上和C++“面向对象的编程语言”本质密切相关。考虑如下的类定义和代码段:class X{public:

ianleelj的专栏 656

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果识别系统(Python+PySide6界面+训练代码)

本文详细介绍了基于YOLO系列目标检测算法(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8)的水果识别系统的设计与实现。系统采用Python语言开发,结合PySide6构建用户界面,实现了从数据准备、模型训练到部署应用的全流程。本文将提供完整的代码实现、详细的训练过程分析以及性能对比实验,并给出推荐的数据集资源。该系统可以准确识别多种水果类型,为智能农业、自动售货、食品加工等领域提供技术支持。

YOLO 565

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

指针里的*符号是要靠近变量类型还是要靠近变量名称?

在C语言中只要使用指针,必然用到*运算符。然后经常会看到不同的书中*有靠近变量类型的,有靠近变量名称的,很迷惑这两者有什么区别。后来上网查证了一下,总结如下: 总体来说,*靠近哪一个都可以,编译器都会认为是指针变量,所以本质是一样的。但是两个形式有不同的优点。 int* p; 这个可以理解为p是int类型的指针。而下面这个 int *p; 可以理解为有一个指针p是int类型,实际上...

吉大秦少游 1万+

STM32F407中文手册

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

C语言零碎知识点之定义指针时星号靠近类型名还是变量名

我们在C语言中定义指针时,星号到底是靠近类型名还是变量名有如下几种情况。

二木成林 3172

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C语言的指针符号到底靠近变量类型还是变量名?

C语言的指针符号到底靠近变量类型还是变量名?

菜菜的菜园子 1494

* 号靠近数据类型,和靠近变量名,& 号靠近数据类型,和靠近变量名,有什么区别

都是声明一个指向整数(int)类型的指针变量,但它们在语法上稍微有些不同,涉及到指针变量的声明和解析时会有一些微妙的影响。都涉及到引用(reference)的声明,但它们在语法上有一些微妙的差异,涉及到引用变量的声明和使用时会产生一些影响。在C++中,*号也有两种不同的用法,一种是用在指针变量前面,表示该变量是一个指针,另一种是用在函数参数列表中,表示引用。在上面的代码中,函数func接受一个引用作为参数,通过修改引用的值,相当于修改了传递给函数的实际参数。被视为一个引用变量,引用一个整数。

每一个不曾起舞的日子,都是对生命的辜负 1441

指针变量的星号是靠近变量名还是靠近类型

1 定义单个变量 int *a; int* a; 意思相同且后者看上去更为清楚:a被声明为类型为 int* 的指针。 但是不推荐,理由见如下: 2 定义多个变量 int* b, c, d; b 是一个指针, 但其余两个变量只是普通的整形. 要声明三个指针, 正确的语句如下: int *b, *c, *d; 3 总结 推荐*号靠近变量 ...

u_hcy2000的博客 611

c语言定义的变量前面有个点是什么意思,C语言变量可以定义在任意位置?不同位置对于性能有影响吗?...

C语言程序开发不像 Python,若是需要使用变量,必须先定义。仔细想一想,C语言这么要求的原因也是容易理解的,至少C程序可以事先知道需要为该变量分配多少内存,这其实也是C语言程序更可控的原因之一。这其实也是C语言程序更可控的原因之一C语言程序的变量虽然“定义再使用”目的是为了使用更小的开销,实现更高的效率,但是很多程序员仍然将它看作是一种落后低效的特性。就代码编写而言的确如此,这增加了整个代码的...

weixin_39947306的博客 1818

变量的声明、定义和初始化

  声明:仅仅是告诉编译器有摸某个类型的变量会被使用;   定义:编译器为这个变量分配内存;   初始化:声明变量后,必须用赋值语句对变量进行显示初始化。 详解: ⏢ 声明一个变量后,必须用赋值语句对变量进行显式初始化,千万不能使用未初始化的变量。例如,下面的语句序列被Java编译器认定为错误的: // not allow(JAVA) -- 未初始化变量a int a; System.out.p...

Lee 1328

C/C++中声明指针变量时星号是靠近变量名还是靠近类型?

摘自<<C和指针>>3.23 int *a; int* a; 两者意思相同且后者看上去更为清楚:a被声明为类型为 int* 的指针. 但是,这并不是一个好技巧,原因如下: int* b, c, d; 人们很自然地以为这条语句把所有三个变量声明为指向整形的指针, 但事实上并非如此. 我们被它的形式愚弄了. 星号实际上是表达式 *b 的一部分, 只对这个标识符有...

weixin_34247155的博客 1611
上一篇: VC++ Windows平台字符透明编程大总结
下一篇: ATL揭秘之“对象创建”篇
hellothere
博客等级 码龄21年 176粉丝 9原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值