我想您大部分回答了您自己的问题。我可能会对您的措辞进行一些小的更改,然后将C.Gibbons所提到的“临时变量”替换为“ rvalue”。
随着您了解C的内存模型,术语变量,参数,临时变量等将变得更加清晰(这看起来像是一个不错的概述:https : //www.geeksforgeeks.org/memory-layout-of-c-program/)。
当您刚开始时,“ rvalue”一词似乎是不透明的,因此我希望以下内容有助于您建立直觉。
左值/右值在谈论等号的不同侧(赋值运算符):左值=左手侧(小写L,而不是“一个”)右值=右手侧
稍微了解C如何使用内存(和寄存器)将有助于理解为什么区别很重要。在广泛的笔触,编译器创建的该计算表达式(右值)的结果的机器语言指令的列表,然后把该结果某处(左值)。想象一下一个编译器处理以下代码片段:
x = y * 3
在汇编伪代码中,它可能类似于以下玩具示例:
load register A with the value at memory address y
load register B with a value of 3
multiply register A and B, saving the result in A
write register A to memory address x
++运算符(及其对应的运算符)需要“某处”进行修改,实质上是任何可以用作左值的东西。
理解C内存模型将有所帮助,因为您将对如何将参数传递给函数以及(最终)如何使用动态内存分配(例如malloc()函数)有一个更好的了解。出于类似的原因,您可能会在某些时候研究一些简单的汇编程序设计,以更好地了解编译器在做什么。另外,如果您使用的是gcc,则-S选项“在编译正常后停止;请勿汇编。” 可能很有趣(尽管我建议您在一个小的代码片段上尝试一下)。
顺便说一句:++指令自1969年就出现了(尽管它始于C的前身B):
(肯·汤普森(Ken Thompson)的观察结果是,++ x的翻译小于x = x + 1的翻译。”
在该维基百科参考之后,您将获得Dennis Ritchie(“ K&R C”中的“ R”)关于C语言历史的有趣文章,此处链接为方便起见:http : //www.bell-labs.com/ usr / dmr / www / chist.html,您可以在其中搜索“ ++”。