C/C++临时变量详解

2023-10-27

临时变量

临时变量是一种只在调用期间有效,且具有常性的变量。

Date &d1 = 2022;//报错

因为该语句会先将2022赋值给临时变量,而临时变量是const的,无法直接赋值给d1,因为这是权限的放大,不合法。

这段代码就是正确的

const Date &d1 = 2022;

那么临时变量是如何产生的呢?

通过各方面资料的查找,总结有三:

①传值返回
我们先看下面代码:

int add(int x,int y)
{
	int sum = x + y;
	
	return sum;
}
int main()
{
	int a = 10;
	int b = 20;
	int re = add(a,b);
	return 0;
}

在main函数中我们调用add函数,add函数将sum的值返回,然后将sum的值赋值给re,可是当add函数调用一结束,sum作为add中的局部变量就会立即消亡,那么这个时候是如何将sum赋值给re的呢?

实际上这个时候临时变量就产生了关键的作用,编译器会创建一个临时变量,将sum的值拷贝给这个临时变量,返回的实际上是这个临时变量的值,函数调用结束将这个临时变量的值赋值给re。

②强制类型转换

强制类型转换一定会产生临时变量,因为编译器并不会对原变量进行强制类型转换,而是将原变量的值强制类型转换为所转类型的值,然后将强制类型转换后的值赋值给相应类型的临时变量,不会改变原变量的类型。

③给const引用赋值

在此之前,我们得先了解什么是左值和右值

左值是有内存空间的,是可以通过地址访问的的数据对象,例如变量、数组元素、结构成员、引用、解引用的指针,右值是没有内存空间,无法通过地址访问的数据对象,例如字面常量和包含多项的表达式(用引号括起来的字符串除外,它们以数组形式存储在代码段中,可由地址表示)

如果引用变量是const,则编译器将在下面两种情况下生成临时变量:

  • 将类型正确的右值赋值给const引用(因为引用变量和其引用对象共享一片内存空间,右值是没有内存空间的,引用变量无法直接引用这个右值,因此必须先创建一个临时变量,将右值赋值给这个临时变量,然后引用变量引用这个临时变量,就比如文章最开始的那两段代码)
  • 将类型错误的变量赋值给const引用变量(编译器会将该变量的值强制类型转换为正确类型,然后将类型正确的值赋值给临时变量,再将临时变量赋值给引用,不会改变原变量的类型)

为什么如果会产生临时变量,引用变量必须是const?

因为临时变量具有常性,那么满足上述三种情况产生临时变量,而引用变量不是const,那我们将临时变量赋值给引用变量时,就会造成权限的放大,编译器会报错

int& a = 15;//创建临时变量,将15赋值给临时变量,然后将临时变量的值赋值给引用,const赋值给非const,这是权限的放大,报错!
double b = 10.5;
int& c = b;//将b的值强制类型转换为int类型并赋值给临时变量,然后赋值,同样会造成权限的放大,报错!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++临时变量详解 的相关文章

随机推荐

  • 有趣的java代码_求一些有趣的java小程序?

    不请自来 用eclipse写的一个输出爱心的小程序 应该算是比较有趣的吧 下面是程序内容 public class love public static void main String args TODO Auto generated m
  • BeanUtils.copyProperties的用法(超详细,建议收藏)

    常见场景 我们如果有两个具有很多相同属性名的JavaBean对象a和b 想把a中的属性赋值到b 例如 接口中将接收到的前端请求参数XxxReqVo 我们想把这个入参转化为XxxQuery对象作为数据库的查询条件对象 传统做法是手动set 即
  • Head First设计模式——策略模式

    Head First设计模式 是一本介绍设计模式的书籍 书中的设计模式主要是用Java语言进行实现 由于本人对C 比较熟悉 因此在阅读这本书籍时 尽自己所能 用C 重新去实现书中所涉及到的设计模式 若有错误或需要进一步讨论之处 望阅览者不吝
  • Uniapp 解决组件在官方文档不支持的事件上,接收小程序原生组件事件

    现在需要在抖音小程序上使用加粉丝群功能 官方 button 有自带这个功能 但是 Uniapp 官网并没有支持 一个是 open type 类型 一个是回调事件 bindjoingroup
  • 用Python做一个CMD命令 很简单我教你自己做一个命令行!

    目录 运用到的库 1 click库 2 作者自己的库 正式开始 hello py winOS py 添加变量环境 简介 大家好我是PYmili 大家都应该会CMD命令吧 什么你不会 看连接 CMD命令大全 大家肯定跟我一样 懒得记 那我就想
  • POSTING_INTERFACE_DOCUMENT解决特别总账'W'类型的过账问题

    Error F5246 Special G L transactions of type are not supported is being raised when trying to post a document via BAPI i
  • Springboot中Filter如何使用

    一 在初始化配置时指定Filter 1 假设自定义一个LoggingFilter 它必须实现Filter接口 public class LoggingFilter implements Filter Override public void
  • 毕业设计-基于机器视觉的直道车道线识别技术-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 边缘检测 二 ROI 区域确定 三 基于 Hough 变换车道线识别 四 车道线拟合 代码部分 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业
  • 关于微信H5自动播放视频-canvas实现逐帧动画效果加音频

    项目需求 用户进入页面自动播放一段小视频 解决方案一 利用 JS reload 之后执行 video play 和 video autoplay 都只能在WEB段实现 但是到了移动端就执行不了 因为项目应用了微信的JS SDK 所以只需要做
  • dereferencing type-punned pointer will break strict-aliasing rules

    最近遇到了一个编译告警 严格别名和类型双关 整理一下相关的材料 strict aliasing 以下问题摘自1 I have the following questions If I leave the code with this war
  • FFmpeg入门详解之70:获取音视频流信息(Metadata)

    用FFmpeg获取视频流 音频流的信息 编码格式 分辨率 帧率 播放时长 简介 我们经常需要知道一个媒体文件所包含的媒体流的信息 比如文件格式 播放时长 码率 视音频编码格式 视频分辨率 帧率 音频属性等信息 如何使用FFmpeg API获
  • 猿人学js混淆-源码乱码解法总结

    猿人学js混淆 源码乱码解法总结 网址 解法 心得 网址 js混淆 源码乱码网址 解法 我是在360浏览器下打开网址 进入审查元素 打开第2页 发现请求网址为 http match yuanrenxue com api match 1 pa
  • 阿里云Redis开发规范

    开发十年 就只剩下这套Java开发体系了 gt gt gt 一 键值设计 1 key名设计 1 建议 可读性和可管理性 以业务名 或数据库名 为前缀 防止key冲突 用冒号分隔 比如业务名 表名 id ugc video 1 2 建议 简洁
  • 十. Kubernetes 核心配置文件与kubelet命令

    目录 一 核心组件与对应的配置文件 二 kubelet 配置文件 常用命令 一 核心组件与对应的配置文件 在使用k8s时 内部有多个核心组件例如用来接收请求的apiServer 解析请求存储etcd的ControllerManage 用来存
  • C++模板类的使用以及运算符重载的实现

    一 类模板及运算符重载的实现 如同函数模板一样 使用类模板使用户可以为类定义一种模式 使得类中的某些数据成员 某些成员函数的参数 某些成员函数的返回值能取任意类型 类模板是对一批仅仅成员数据类型不同的类的抽象 程序员只要为这一批类所组成的整
  • 简明区块链原理

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 区块链 应有特质 使用了具有 哈希链 下文有解释 形式的数据结构保存基础数据 有多个结点参与系统运行 分布式 通过一定的协议或算法对于基础数据的一致性达成共识 共识
  • R语言优雅的修改列名称

    说实话 我一直没有搞懂R语言的dpyr包的rename是怎么用的 很奇怪 我一直用不好这个函数 或者说 我就不太喜欢他这个更改表格列名称的方式 但是我今天在stackoverflow上看到了一个人是这么用的 非常的amazing 介绍 在修
  • JAVA中Object类的toString()方法

    toString public String toString 返回该对象的字符串表示 通常 toString 方法会返回一个 以文本方式表示 此对象的字符串 结果应是一个简明但易于读懂的信息表达式 建议所有子类都重写此方法 Object
  • vxe-table 固定列滚动完成后没有对齐

    vxe table 固定列滚动完成后没有对齐 默认情况下 虚拟滚动是自动开启的 当行数超过设置的 scroll y gt 时 就会自动触发虚拟渲染 即只渲染可视区内的数据 所以要想将性能达到最优 应该确保可视区内的显示条数尽可能减少 建议在
  • C/C++临时变量详解

    临时变量 临时变量是一种只在调用期间有效 且具有常性的变量 Date d1 2022 报错 因为该语句会先将2022赋值给临时变量 而临时变量是const的 无法直接赋值给d1 因为这是权限的放大 不合法 这段代码就是正确的 const D