关于“左值”

简介:

记得以前看到一篇文章,介绍什么是“左值”,“左值”有什么样的限制:
1、常量表达式不能成为左值;
2、临时对象不能成为左值;
3、const修饰的变量不能成为左值;
……

看到“左值”这个概念的时候,让人觉得有些诧异。
“左值”,顾名思义就是等号左边的值。说白了,就是在一个表达式中要被写的那个值。但是我觉得“左值”这个概念实在太故弄玄虚,给人的第一感觉是,“因为这个值在左边,所以它要接受限制”。(这是什么逻辑……)
然而,如果取个本份点的名字,比如“被写值”呢?因为这个值将被写,所以它要接受一些限制。

1、不允许改写常量表达式,否则多次执行同样一段代码可能得到不同的结果。
如果常量字符串"hello world"会被改写,那么printf("hello world");可能没法将"hello world"给print出来。这样的逻辑不是很匪夷所思吗?
所以,一般常量字符串会被编译器放在程序的只读数据段中,由内核来保证它们不可写。(当然,C标准并没有规定编译器一定要这么做。标准只是说,写常量字符串将得到一个不可预知的结果。)

2、不允许写编译器产生的临时对象,因为这样的写操作是无意义的。
在C/C++中,使用常规手段是无法访问到临时对象的(当然存在非常规的办法)。写过之后临时对象再也没有被读的机会了,写了干什么呢?
如果偏要写呢?那应该倒没什么关系,不过就是在运行栈写一些信息而已。

3、不允许写const变量,因为这是程序主动申请的限制。
编译器的作用并不仅仅是把源代码编译成目标代码,它还需要有源代码的查错机制。所有这些限制都是为程序的逻辑服务的,这就是高级语言的高级之处。
(记得大学时教《编译原理》的教授曾说过,编译错误永远只是小问题,因为不需要你思考,错误都让编译器都给你找出来了。而我们写程序应该把编译器的查错功能利用起来,尽可能的把错误暴露给编译器;而不是想办法欺骗编译器,让它帮你编译出漏洞百出的目标代码。)

显然,以上这些限制,都是因为“值”要被写而造成的,并不是因为“值”在左边。

后来发现,关于“左值”和“右值”,还有另外一种释义。“左值”(l-value)实际上是“存储(可写)地址”(location value)、“右值”(r-value)实际上是“读地址”(read value)。这个解释倒是贴切多了~


目录
相关文章
|
存储 安全 关系型数据库
AWS介绍
AWS介绍
939 0
|
3月前
|
存储 人工智能 JavaScript
3分钟让AI龙虾OpenClaw成为你的“公众号分身” | 阿里云服务器玩Openclaw
2026年,AI工具的核心竞争已从“能对话”升级为“能执行”,OpenClaw(前身为Clawdbot/Moltbot)凭借“开源可控、强执行能力、隐私优先”的核心优势,成为个人与企业私有化部署的首选。它不再是单纯的对话式AI,而是能在本地或私有云环境中完成文件操作、流程编排、浏览器自动化的“自托管式AI数字员工”,所有数据存储于自有设备,敏感信息不出内网,完美平衡效率与合规要求。
1229 3
|
3月前
|
监控 API 数据安全/隐私保护
OpenClaw阿里云/本地台部署+商业落地指南|5类实战案例+API配置与避坑要点
2026年,OpenClaw(Clawdbot)已从技术工具演进为具备商业落地能力的经济代理载体,其核心价值并非直接“生成收益”,而是通过自动化执行、实时数据监控、决策效率提升构建竞争优势,最终转化为可量化的经济价值。通过对公开案例的梳理发现,成功的商业落地多集中在决策辅助、自动化流程、知识服务三大方向,而落地的前提是完成稳定的部署与合理的模型配置。本文结合5个真实商业案例,拆解OpenClaw的商业应用逻辑与避坑要点,完整提供阿里云及本地多系统部署流程、免费大模型API配置方法,形成一套“部署-配置-落地-避坑”的完整方案,全程不含营销词汇,兼顾实用性与可操作性。
727 0
|
开发者 程序员
基于阿里云快速搭建数字营销引擎【计算广告】
阿里云营销引擎有别于其他阿里云产品,它是配合阿里云MaxComputer,画像分析,分析型数据库等多个云产品,并在高德DMP和友盟+DMP提供人群分析能力的基础上,提供一整套数字营销解决方案。 在过去搭建一套成熟DSP平台需要一个强大的技术和业务团队,现在只需要一个人就能够轻松完成,大幅降低了系统构建的基础设施成本,运维成本,容灾成本,开发成本,时间成本。
3872 0
|
存储 物联网 调度
操作系统的心脏:内核深度解析
在数字世界的构建中,操作系统扮演着基石的角色,而其核心—内核,则是这一复杂系统的灵魂。本文将深入探讨操作系统内核的工作原理,揭示它是如何管理硬件资源、运行程序以及提供系统服务的。通过理解内核的结构和功能,我们可以更好地把握计算机系统的运作机制,进而优化和创新我们的技术实践。
|
Java 开发者
华为仓颉语言初识:结构体struct和类class的异同
华为仓颉语言是一种基于鸿蒙系统的新型编程语言,结合了Java和C的特点,支持与ArkTs互相调用,提升应用性能。本文详细对比了仓颉语言中结构体(struct)和类(class)的区别:struct不支持继承,赋值时为值传递;而class支持单继承、多实现,赋值时为引用传递。两者均支持构造函数及成员访问修饰符,但struct新增internal修饰符限制包内访问。开发者需根据实际需求选择合适的使用场景。
497 3
|
人工智能
第二批拟立项名单|2024年阿里云协同育人项目立项通知
第二批拟立项名单|2024年阿里云协同育人项目立项通知
|
人工智能 Cloud Native 架构师
CNCF 宣布 Dapr 毕业
Dapr 是一个可移植的分布式应用运行时,提供集成 API,帮助开发者构建可靠和安全的分布式应用,提升生产力 20-40%。Dapr 于 2019 年由微软发布,并于 2021 年 11 月正式加入 CNCF。截至 2024 年 11 月 13 日,Dapr 已正式从 CNCF 毕业。它支持多种云原生技术,广泛应用于 Grafana、FICO、HDFC 银行等企业。
594 2
|
搜索推荐 API 云计算
解锁API经济:社会发展的数字化未来
本文深度剖析了API经济在推动社会发展中扮演的关键角色,尤其聚焦于其作为数字经济重要驱动力的地位。API经济不仅促进了技术创新与应用的融合,还加速了产业互联的步伐,为传统行业转型注入了新的活力。它通过搭建开放共享的数据平台,打破了信息孤岛,实现了跨行业、跨地域的数据流通与价值创造,极大地提升了社会整体的资源配置效率。同时,API经济的繁荣也催生了新型商业模式,激发了创业创新的热情,为经济社会发展提供了源源不断的动力。在数字化转型的大背景下,API经济正逐步成为衡量国家和地区竞争力的重要指标之一。它不仅改变了企业的运营模式,还深刻影响着政府治理、公共服务等领域,推动社会治理体系和治理能力现代化。
675 0

热门文章

最新文章