我假设当我们声明int a ; a=10;
时,编译器会获取r值&把它放在它的l值。此时,l值始终被视为存储器位置中的地址,即左侧的分配操作中的一个或任何其他变量被视为(&variable)
。因此我们能够捕获其地址以将r值放入其中。
我的假设是对还是错?如果错了,那背后的基本理念是什么?
答案 0 :(得分:2)
你让它变得比它需要的更复杂。 language definition只是声明:
赋值运算符将值存储在左操作数指定的对象中。
(6.5.16,第3段)。
唯一的一般约束是左操作数是可修改的左值。左值可以对应于寄存器(没有地址)或可寻址的存储位置。它究竟是如何发生的是一个实现细节。
答案 1 :(得分:1)
赋值运算符有两个操作数。左操作数必须是“可修改的左值”。
“左值”大致是指定对象的表达式。
(“rvalue”,因为C标准使用该术语,只是评估表达式产生的值.C标准定义了术语,但很少使用它。用法有点不一致:“左值” “是一个表达式,但”rvalue“是一个值。)
右操作数已评估以产生值。然后,如果需要,将该值转换为左操作数的类型,并将结果存储在左操作数指定的对象中。
不需要地址。例如,使用register
定义的变量没有地址,但它仍然可以作为赋值的目标。
如果您需要详细信息,请参阅C standard的第6.5.16节(链接指向n1570.pdf
,最新草稿,1.7兆字节PDF。)
答案 2 :(得分:0)
条款"左值"和" rvalue"来自于=
符号的左侧和右侧,因此是自我反思的定义。 (即,并非真正有用。)
但重要的是,rvalue必须能够产生一个值(即有限的位模式),而左值必须能够为其赋予类似的值。
因此,左值必须最终代表存储地址或寄存器或I / O端口或其他东西(还有什么吗?),可以写入"。但这并不意味着左值包含一个地址 - 它只代表编译器中的可寻址实体,并将被转换为" real"在生成的程序集中寻址信息。也就是说,它只是一个名字。
另一方面,另一方面,rvalue不需要表示"真实的东西",但可以是文字或某种表达或调用或其他什么,只要它产生"值&# 34;当被问到时。