2017-08-12 31 views
0

从下在果壳:为什么不能将左值解析为相应对象的地址,当对象是位值还是用寄存器存储类声明时?

左值是指定一个对象的表达式,并且它可以 上的赋值运算符的左侧出现。

左值总是可以被解析为相应的对象的 地址,除非对象是一个位字段使用寄存器存储类声明的变量。

  1. 根据来自报价第二句,当对象是 比特值或使用寄存器存储类声明的变量, 一个左值不能被解析为相应的对象的地址。 这是为什么?
  2. 给定一个左值不能被解析为相应的对象的 地址,怎么能左值指定的对象,出现在赋值运算符的 左侧?

  3. 我认为,以下三个条件是等价的:

    • 一个左值不能被解析为相应的对象的地址,
    • 一个左值指定的对象,
    • 一个左值可以出现在赋值运算符的左侧。

    其中任何一个都可以用作左值的定义。我是 对不对?

谢谢。

+0

您可以解决任何在字节边界上对齐的问题,但是您无法解决一点问题。位字段只是一组位,你不能解决它。你可以说你可以计算字段中相对于持有该字段的位的偏移量,但这不同于给它一个地址。 –

+2

寄存器没有数字地址。位域也没有地址。他们是C的规则 –

回答

2

最小寻址能力分辨率是char。如果你想有一个位字段,这是内一个或多个位一个char所以不能有自己的地址,除非你允许像42.6地址这将吹头了大部分程序员:-)

变量与寄存器存储类通常无法解决,因为它们不一定存储在内存中的任何位置 - 也就是说,寄存器存储类意味着什么:尝试将此值保存在寄存器中。

但是,即使您无法获得这些对象的地址,但这并不意味着您无法分配给它们。对于寄存器中的对象,您只需更改寄存器。

而且,对于位域,您可以使用布尔操作,如and/or来操作部件的可寻址值。

相关问题