2016-09-02 13 views
2

我始终认为,l值必须进行评估,但这是由于某种明显且容易解释的原因。标识符表示存储区域,并且该值位于该存储区中并且必须被检索。这就说得通了。但是一个需要评估文字的程序(例如整数21)对我来说并不合理。价值就在那里,你能明确得多吗?那么,除了为无符号或其他后缀添加U.这就是为什么我对文字需要被评估的好奇心,因为我只在一个地方看到过这种文字。大多数书籍也转换术语,如“主要表达”,“操作数”或“子表达式”等等,直到线条开始模糊。在这段时间里,我还没有看到这个特定事物的明确解释。这似乎是浪费处理能力。C++中的文字是否真的评估?

+1

*“我只在一个地方看到过这一点”* - 谨慎分享? – LogicStuff

+2

“l值必须评估”这是什么意思? – juanchopanza

+0

l值有需要检索的变量值 –

回答

6

编译器在编译期间只需要评估普通文字。

也可以在运行时评估用户定义的文字。例如,在包含<string>标题并使其...s文字可用于指令using namespace std::string_literals;后,则"Blah"sstd::string类型的用户定义文字。编译器在编译时对"Blah"部分进行评估。涉及动态分配的转换为std::string必然发生在运行时。

+0

*编译器在编译期间只需要对普通文字进行评估*严格地说,浮点类型并非完全正确。请参阅[我的答案](http://stackoverflow.com/a/39293264/6394138)。 – Leon

+0

@Leon他确实说过*普通*文字..... – DarthRubik

+0

@Leon:我无法想象每个fp文字可能有多于两个可能的二进制结果。所以在编译时生成这两者都没有问题。在运行时,舍入模式可以在值块之间切换。但由于我没有听说过这样的计划,我认为这不是在实践中完成的。 –

1

但是需要评估文字的程序(例如整数 21)对我来说并不合理。价值就在那里,你能得到多少明确的数字?

事情对于浮点类型来说有点复杂。考虑号码0.1。在二进制中,它不能精确表示,必须为其选择最接近的浮点表示。如果在运行期间输入该数字,则0.1到二进制表示的转换必须遵循舍入模式(向上,向下,趋近于零,朝向无穷大)。对浮点运算的严格处理表明,浮点数字转换为二进制表示也应该根据舍入模式(在运行时才会知道)执行,因此不能由编译器完成(实际上它的大部分可以由编译器完成,但最后的四舍五入必须在运行时执行,并考虑舍入模式)。

+1

在运行时不是强制性的。 C++标准§2.13.4规定“...如果缩放值处于其类型的可表示值范围内,则结果是缩放值(如果可表示),否则缩放值最接近缩放值的较大或较小可表示值一个实现定义的方式......“。这意味着编译器必须*记录*它是如何完成的,但它也可以在编译时完成。 – alain