为什么字符串文字L值,而所有其他的文字是R值?为什么字符串文字L值,而所有其他的文字是R值?(Why

2019-05-13 10:09发布

C ++ 03 5.1基本表达式
§2:

文本是一个基本表达式。 它的类型取决于它的形式(2.13)上。 字符串文字是一个左值; 所有其他的文字是右值。

这背后有什么道理呢?
据我所知,字符串是对象,而其他所有的文字都是not.And的左值总是指的对象。

但接下来的问题是,为什么字符串常量对象,而所有其他的文字是不是?
这个理由在我看来更像是一个鸡蛋或鸡的问题。

我理解这个问题的答案可能与硬件体系结构,而不是C / C ++为编程语言,但我想听到的一样。

注:我标记这个问题为C&C ++一方面是因为C99标准也有类似的报价,具体§6.5.1.4

Answer 1:

字符串文字是文字与数组类型,并且用C没有办法用于阵列型在一个表达式存在除了作为左值。 本来是指定的字符串有指针类型(而不是通常衰减到一个指针数组类型)指向字符串“内容”,但是这会让他们宁可少有用的; 尤其是sizeof操作符不能适用于他们。

需要注意的是C99引入复合文字,这也是左值,所以具有文字是左值不再是一个特殊的例外; 它更接近于常态。



Answer 2:

字符串文字是数组 -本来就无法预知大小的对象(即,的用户定义的,并可能大尺寸)。 在一般的情况下,有简单地表示,除了在内存中的对象,即作为这样的文字没有其他办法lvalues 。 在C99这也适用于复合文字 ,这也是lvalues

任何尝试人为地掩藏事实字符串文字是lvalues在语言级别会产生相当数量的完全不必要的困难,因为以指向一个字符串的指针以及为阵列依赖访问它的能力的能力关键取决于它的左值内斯是在语言级别上可见。

与此同时,标量类型的文字有固定编译时的大小。 与此同时,这样的文字是很可能被直接嵌入到在给定的硬件体系结构的机器命令。 例如,当你写像i = i * 5 + 2中,文字值52的所产生的机器代码变得明确的(或甚至隐含的)部分。 他们不存在,也不需要存在,作为数据存储的独立位置。 有根本中存储的值没有点52中的数据存储器。

还值得一提的是,在许多(如果不是大多数,或者全部)硬件架构浮点文字作为“隐藏”的实际执行的lvalues (即使语言不公开它们的方式)。 从浮点团,如x86机器指令平台不支持嵌入式立即数。 这意味着,实际上每个浮点文字具有要被存储在(和读取)由编译器数据存储器。 例如,当你写的东西像i = i * 5.5 + 2.1它被翻译成类似

const double unnamed_double_5_5 = 5.5;
const double unnamed_double_2_1 = 2.1;
i = i * unnamed_double_5_5 + unnamed_double_2_1;

换句话说, floating-point literals往往最终成为“非官方” lvalues内。 然而,它非常有意义的是语言规范没有作出任何企图揭露这个实现细节。 在语言层面, arithmetic literals更有意义的rvalues



Answer 3:

lvalue在C ++中并不总是指代对象。 它可以指一个功能了。 此外,对象没有通过被称为lvalues 。 它们可以通过被称为rvalues ,包括对阵列(在C ++和C)。 然而,在旧C89,数组指针转换没有申请rvalues数组。

现在,一个rvalue表示没有,有限的或即将过期的寿命。 字符串文字,然而,生活的整个程序。

所以, string literalslvalues是完全正确的。



Answer 4:

我猜想,原动机主要是一个务实的:一个字符串文字必须驻留在内存中,并有一个地址。 类型的字符串文字的是数组类型( char[]在C, char const[]在C ++),和数组类型转换为指针在大多数情况下。 该语言可能已经找到其他的方法来定义这个(如一个字符串可以有指针类型,首先,与有关的特殊规则是什么指着),但就是字面的左值可能是确定的最简单的方法是什么具体需要。



文章来源: Why are string literals l-value while all other literals are r-value?