漫谈:C语言 C++ 左值、右值、类型转换

        编程不是自然语言,编程自有其内在逻辑。

左值引起的BUG

        编译器经常给出类似这样的BUG提示:

        “表达式必须是可修改的左值”

        “非常量引用的初始值必须是左值”

        看一下示例:

#include <iostream>void f(int& x)
{}
int main()
{short a = 1;f((int)a);//非常量引用的初始值必须是左值(int)a = 5;//表达式必须是可修改的左值return 0;
}

左值是什么

        "左值"到底是什么啊?左值其实就是可以放在赋值(=)左边的东西,右值就是可以放在右边的东西。

        那什么可以放在赋值的左边呢?放在内存里的、有地址的东西都可以。

为什么类型转换不是左值

        那么为什么“(int) a”不可以呢?这就涉及到自然语言和编程的差异:自然语言讲概念,编程则必须落到实体:内存或者寄存器。

        自然语言的一个“数”是一个概念,有符号、无符号、存储长度都是没所谓的,只是概念上的一点限制。而对于编程,这些都要落实到具体的内存或寄存器上。

        从一个short到int,直觉上就是一个概念变化嘛,a还是那个a,但是实际呢?

        想一下,short和int长度都不一样,“(int)a”还能是原来那个a吗?

        所以“(int)a”发生了什么?发生了一个临时变量,长度是4个字节,放在寄存器里,没有内存地址,用完了就扔了。

        所以直接给“(int)a”赋值是没有意义的,程序的其他地方不可能引用这个只在寄存器里存在的对象(当然把寄存器里的临时变量赋值给一个有内存地址的变量是没问题的,这就是正常的赋值语句嘛)。

        引用参数为什么也不可以呢?因为用引用的目的是像指针一样操作外面的对象,传一个临时变量进去完全没有意义(把引用理解成指针的另一种形式是完全没有问题的)。

        即使是有符号、无符号转换,虽然长度不变,但逻辑上是一样的,都是生成一个临时对象。

类型转换究竟发生了什么

  •         整数长度增加的转换会根据是否有符号进行不同的扩展方式:

        无符号:前面扩展0

        有符号:扩展符号位

        效果:长度增加值不变。

  •         整数长度不变、仅仅是有符号、无符号改变:

        实际存储不变

        结果是负值变成很大的正数或很大的正数变成负值。

  •         长度变小的转换怎么做?

        疯了,没事别这么做。

  •         整数和浮点数转换:

        浮点数的格式和整数完全不一样啊,一定要经过专门的指令来转换

总结

  • 左值就是能赋值的对象
  • 类型转换是临时对象,不是左值

(这里是结束)

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

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

相关文章

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度&#xff0c;对于LLM的精确部署不太友好&#xff0c;在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说&#xff0c;当h&#xff08;heads&#xff09; 1时&#xff0c;在默认情况下&#xff0c; W i Q W_i^…

【JDK 8-Lambda】3.1 Java高级核心玩转 JDK8 Lambda 表达式

一、 什么是函数式编程 &#xff1f; 二、 什么是lambda表达式&#xff1f; 1. 先看两个示例 A.【创建线程】 B.【数组排序-降序】 2. lambda表达式特性 A. 使用场景(前提): B. 语法 (params) -> expression C. 参数列表 D. 方法体 F. 好处 一、 什么是函数式编…

Wrapper可以构造的复杂查询条件汇总

目录 概述1、eq&#xff1a;等于条件2、ne&#xff1a;不等于条件3、gt&#xff1a;大于条件4、ge&#xff1a;大于等于条件5、lt&#xff1a;小于条件6、le&#xff1a;小于等于条件7、like&#xff1a;模糊查询条件8、notLike&#xff1a;不包含关键字的模糊查询条件9、左模糊…

实在智能携手40+央企,探索财务大模型及数智化实践与应用

“这次培训给我一个最大的感触就是&#xff0c;过去以为AI智能化、大模型技术是很高深的事情。但现在&#xff0c;我们通过RPA等数字化工具&#xff0c;自主根据自己的工作岗位&#xff0c;完成业务自动化流程的开发和设计。AI技术没有想象中的那么难入门。” 这是一位参加了“…

持续集成Jenkins安装部署

Jenkins是一个在DevOps领域中、支持CI/CD&#xff08;持续集成/持续交付&#xff09;过程域的开源项目&#xff0c;其提供可扩展插件的支持&#xff0c;以自动化的机制对项目工程执行打包、编译、构建、测试以及最终发布到目的地服务器并成功部署运行&#xff0c;本文主要描述J…

如何在批发零售业运用IPD?

批发零售业指购进商品后&#xff0c;再向其他批发或零售单位&#xff08;含个体经营者&#xff09;及其他企事业单位、机关团体等批量销售生活用品、生产资料的活动&#xff0c;以及从事进出口贸易和贸易经纪与代理的活动&#xff0c;包括拥有货物所有权&#xff0c;并以本单位…

左神高级提升班2 约瑟夫环结构

目录 【案例1】 【题目描述】 【输入描述&#xff1a;】 【输出描述&#xff1a;】 【输入】 【输出】 【思路解析】 【代码实现】 【案例1】 【题目描述】 某公司招聘&#xff0c;有n个人入围&#xff0c;HR在黑板上依次写下m个正整数A1、A2、……、Am&#xff0c;然后…

如何在JoySSL上申请免费的SSL证书

1&#xff0c;前往 JoySSL 的官方网站注册页面&#xff0c;创建一个账号并登录您的 JoySSL 账户。 扫码注册账号申请免费证书https://www.joyssl.com/certificate/select/free.html?nid52&#xff0c;找到并选择你需要的 SSL 证书相关的功能或选项。 3&#xff0c;提供您的域…

springboot实现发送邮箱验证码

准备工作 在邮箱官网开放SMTP授权&#xff0c;获取相应密钥&#xff0c;才可以进行发送邮件 这里以网易163邮箱为例&#xff0c;登录邮箱后&#xff0c;依次点击“设置-POP3/SMTP/IMAP” &#xff0c;然后开启SMTP服务。这时候会提示一个授权码&#xff0c;例如&#xff1a;H…

全流程ARCGIS Pro技术应用教程

详情点击公众号链接&#xff1a;全流程ARCGIS Pro技术应用教程 前沿 GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关…

【Ambari】银河麒麟V10 ARM64架构_安装Ambari2.7.6HDP3.3.1(HiDataPlus)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

Matlab中(:,1)和(:,end)和[~, A]的含义与用法

背景 阅读Moses Chong-ook Nah的DMP-MATLAB程序记录。 github链接&#xff1a;https://github.com/mosesnah-shared/DMP-MATLAB 如果不知道某个函数或变量的作用&#xff0c;直接打印出来&#xff0c;看看输出是什么。不知道matlab如何打印&#xff1f;程序后面的分号;去掉就…

Day1-DeepWalk

论文《DeepWalk: Online Learning of Social Representations》 2014年发表在数据挖掘顶会ACM SIGKDD&#xff08;KDD&#xff09;上的论文 目的&#xff1a;学习节点表示 推动&#xff1a;将自然语言处理里面的无监督学习方法迁移至此 思路&#xff1a;将图结构序列化&#x…

C#中实现校验是否包含中文与http接口地址中解析ip和端口号

场景 Winform/CSharp中实现对Http接口地址、IP地址字符串格式/合法性校验&#xff1a; Winform/CSharp中实现对Http接口地址、IP地址字符串格式/合法性校验_c# 检查ip格式_霸道流氓气质的博客-CSDN博客 在上面的基础上对某http接口地址(ip加端口号&#xff0c;示例http://12…

深入电机控制基础知识(1)- 磁共能与电磁转矩

1.1 概述 打开任意一本电机学的教材&#xff0c;翻到电机基本概念的说明的位置&#xff0c;总能看到一句描述电机本质的话&#xff1a;电机是一种机电能量转化的装置。 机电能量转化&#xff0c;很生动形象的说明电机的工作原理。对于电动机而言&#xff0c;吸收电能&#xff…

LuatOS-SOC接口文档(air780E)--errDump - 错误上报

示例 -- 基本用法, 10分钟上报一次,如果有的话 if errDump thenerrDump.config(true, 600) end-- 附开源服务器端: https://gitee.com/openLuat/luatos-devlogerrDump.dump(zbuff, type, isDelete) 手动读取异常日志&#xff0c;主要用于用户将日志发送给自己的服务器而不是I…

全网首发YOLOv5/YOLOv7暴力涨点:Gold-YOLO,遥遥领先,超越所有YOLO | 华为诺亚NeurIPS23

💡💡💡本文独家改进:提出了全新的信息聚集-分发(Gather-and-Distribute Mechanism)GD机制,Gold-YOLO,替换yolov5 head部分 实现暴力涨点 Gold-YOLO | 亲测在多个数据集能够实现大幅涨点 💡💡💡Yolov5/Yolov7魔术师,独家首发创新(原创),适用于Yolov5、…

优思学院|如何解读Minitab中测量系统分析(MSA GRR)的结果?

在现代制造和质量控制过程中&#xff0c;精确的测量是至关重要的。为了确保我们的测量工具可靠&#xff0c;我们需要评估其重复性与再现性。这就是测量系统分析&#xff08;Measurement System Analysis&#xff0c;简称MSA&#xff09;的关键目标之一。以下将介绍如何使用Mini…

Vue如何监听键盘事件

引言 在Web开发中&#xff0c;键盘事件是非常常见的交互方式之一。Vue作为一种流行的JavaScript框架&#xff0c;提供了一种简单而灵活的方式来监听键盘事件。本文将介绍如何在Vue中监听键盘事件&#xff0c;并展示一些实用的示例。 目录 Vue中监听键盘事件的基本用法监听特定…

前端进阶--深入理解JavaScript

1、JS的作用域和作用域链 作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问&#xff0c;通过作用域链&#xff0c;我们可以访问到外层环境的变量和函数。作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象…