我始终认为,l值必须进行评估,但这是由于某种明显且容易解释的原因。标识符表示存储区域,并且该值位于该存储区中并且必须被检索。这就说得通了。但是一个需要评估文字的程序(例如整数21)对我来说并不合理。价值就在那里,你能明确得多吗?那么,除了为无符号或其他后缀添加U.这就是为什么我对文字需要被评估的好奇心,因为我只在一个地方看到过这种文字。大多数书籍也转换术语,如“主要表达”,“操作数”或“子表达式”等等,直到线条开始模糊。在这段时间里,我还没有看到这个特定事物的明确解释。这似乎是浪费处理能力。C++中的文字是否真的评估?
回答
编译器在编译期间只需要评估普通文字。
也可以在运行时评估用户定义的文字。例如,在包含<string>
标题并使其...s
文字可用于指令using namespace std::string_literals;
后,则"Blah"s
是std::string
类型的用户定义文字。编译器在编译时对"Blah"
部分进行评估。涉及动态分配的转换为std::string
必然发生在运行时。
*编译器在编译期间只需要对普通文字进行评估*严格地说,浮点类型并非完全正确。请参阅[我的答案](http://stackoverflow.com/a/39293264/6394138)。 – Leon
@Leon他确实说过*普通*文字..... – DarthRubik
@Leon:我无法想象每个fp文字可能有多于两个可能的二进制结果。所以在编译时生成这两者都没有问题。在运行时,舍入模式可以在值块之间切换。但由于我没有听说过这样的计划,我认为这不是在实践中完成的。 –
但是需要评估文字的程序(例如整数 21)对我来说并不合理。价值就在那里,你能得到多少明确的数字?
事情对于浮点类型来说有点复杂。考虑号码0.1
。在二进制中,它不能精确表示,必须为其选择最接近的浮点表示。如果在运行期间输入该数字,则0.1
到二进制表示的转换必须遵循舍入模式(向上,向下,趋近于零,朝向无穷大)。对浮点运算的严格处理表明,浮点数字转换为二进制表示也应该根据舍入模式(在运行时才会知道)执行,因此不能由编译器完成(实际上它的大部分可以由编译器完成,但最后的四舍五入必须在运行时执行,并考虑舍入模式)。
在运行时不是强制性的。 C++标准§2.13.4规定“...如果缩放值处于其类型的可表示值范围内,则结果是缩放值(如果可表示),否则缩放值最接近缩放值的较大或较小可表示值一个实现定义的方式......“。这意味着编译器必须*记录*它是如何完成的,但它也可以在编译时完成。 – alain
- 1. 此声明是否会评估为真?
- 2. string.find()总是评估为真
- 3. 是ColdFusion的评估()真的很危险?
- 4. isdigit()在C中未评估为真
- 5. 测试是否存在文件中的模式,评估是否
- 6. VBA:评估SQL语句是否是真还是假
- 7. Objective-C是否使用短路评估?
- 8. 对于所有的Falsy值,是否(!value)评估为真?
- 9. C:如果条件不评估为真
- 10. Rails,评估数字是否顺序
- 11. 布尔总是评估为真
- 12. forall总是评估为真[Drools 6.3 final]
- 13. GNU make:ifneq总是评估为真
- 14. C++中的评估顺序
- 15. c#中的后期评估?
- 16. C++中的“评估函数”
- 17. C中的postfix评估
- 18. 是否可以强制c中宏的评估?
- 19. scheme - 评估真假列表
- 20. 是否有任何情景(i!= i)会被评估为真?
- 21. 评估单元格中的公式是否包含字符
- 22. Python“if”是否评估“and”的双方?
- 23. Lambda Expression - 它的评估是否正确?
- 24. 伊德里斯真的“严格评估?”
- 25. 评估%×()为真或假的红宝石
- 26. C:评估字符串的一部分
- 27. Postfix评估C
- 28. 小枝字符串比较总是评估为真
- 29. 有条件的总是评估好像是真
- 30. 评估c#代码aspx文件中的字符串
*“我只在一个地方看到过这一点”* - 谨慎分享? – LogicStuff
“l值必须评估”这是什么意思? – juanchopanza
l值有需要检索的变量值 –