c++中的字面量真的会求值吗?

Do literals in C++ really evaluate?

本文关键字:真的 c++      更新时间:2023-10-16

我一直认为l值必须求值,但出于某种明显且易于解释的原因。标识符表示存储区域,该值位于该存储区域中,必须检索。这说得通。但是一个需要计算字面量(例如,整数21)的程序对我来说不是很有意义。值就在这里,你还能再明确多少呢?除了加上U表示unsigned,或者其他后缀。这就是为什么我对需要评估的字面量感到好奇,因为我只在一个地方看到过这一点。大多数书籍还会调换术语,如"主表达式"、"操作数"或"子表达式"等,以至于界线开始模糊。这么长时间以来,我还没有看到对这件事有一个明确的解释。这似乎是在浪费处理能力。

普通文字只需要在编译时由编译器计算。

用户定义的文字也可以在运行时求值。例如,在包含<string>头,并使其...s字面值由指令using namespace std::string_literals;可用之后,则"Blah"s是类型为std::string的用户定义字面值。"Blah"部分在编译时由编译器求值。到std::string的转换涉及到动态分配,必须在运行时进行。

但是一个程序需要计算一个字面值(例如,整数)我不太明白。值在这里,是多少你还能说得更清楚吗?

对于浮点类型,情况稍微复杂一些。考虑数字0.1。在二进制中,它不能精确地表示,必须为它选择最接近的浮点表示。如果在运行时输入该数字,则0.1到二进制表示的转换必须遵循舍入模式(向上、向下、向零、向无穷大)。对浮点运算的严格处理表明,0.1浮点文字到二进制表示的转换也应该按照舍入模式执行(这只在运行时才知道),因此不能由编译器完成(实际上它的大部分可以由编译器完成,但最后的舍入必须在运行时执行,考虑到舍入模式)。