字符串字面量是数组- 本质上不可预测大小的对象(即用户定义的并且可能很大的大小)。在一般情况下,除了作为内存中的对象(即lvalues
. 在 C99 中,这也适用于复合文字,它们也是lvalues
.
任何人为地隐藏字符串文字处于语言级别这一事实的尝试lvalues
都会产生大量完全不必要的困难,因为使用指针指向字符串文字的能力以及作为数组访问它的能力至关重要它的左值性在语言级别上是可见的。
同时,标量类型的文字具有固定的编译时大小。同时,这些文字很可能直接嵌入到给定硬件架构上的机器命令中。例如,当您编写类似i = i * 5 + 2
的内容时,文字值5
并2
成为生成的机器代码的显式(甚至隐式)部分。它们不存在,也不需要作为数据存储中的独立位置存在。5
存储值和2
数据存储器根本没有意义。
还值得注意的是,在许多(如果不是大多数或全部)硬件架构上,浮点文字实际上是作为“隐藏的”实现的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
。