在Stroustrup的新书“The C ++ Programming Language - Fourth Edition”的第10.5.1节中,他说,在执行算术运算之前,使用整数提升来创建较短整数类型的整数,同样地,浮动 - 点推广用于从浮点数中创建双打。
我使用以下代码确认了第一个索赔:
#include <iostream>
#include <typeinfo>
int main()
{
short a;
short b;
std::cout << typeid(a + b).name() << std::endl;
}
使用vc ++输出“int”,使用gcc输出“i”。
但是用浮点数而不是短路来测试它,输出仍然是“浮动”或“f”:
#include <iostream>
#include <typeinfo>
int main()
{
float a;
float b;
std::cout << typeid(a + b).name() << std::endl;
}
根据Stroustrup的说法,浮点促销规则没有例外,所以我期望输出“double”或“d”。
关于促销活动的上述部分是错误的还是某种程度上不清楚?关于类型促销,C ++ 98和C ++ 11有什么不同吗?
答案 0 :(得分:29)
我不知道Stroustrup的书到底是什么,但根据标准,float
在这种情况下不会转换为double
。在应用大多数算术二元运算符之前,应用5p9中描述的通常的算术转换:
- 如果任一操作数是作用域枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式不正确。
- 如果任一操作数的类型为long double,则另一个操作数应转换为long double。
- 否则,如果任一操作数为double,则另一个操作数应转换为double。
- 否则,如果任一操作数为float,则另一操作数应转换为float。
- 否则,应对两个操作数执行整体促销(4.5)。 [...]
整体促销是导致两个short
转换为int
的原因。但是根据这些规则,两个float
将不会转换为double
。如果您向float
添加double
,则float
将转换为double
。
以上内容来自C ++ 11。 C ++ 03包含相同的规则,但引用范围枚举的规则除外。
答案 1 :(得分:6)
与此同时,Stroustrup似乎认识到推荐句不正确或至少具有误导性。他从第10.5.1节删除了关于浮点促销的判决。
请参阅Stroustrup网页上第4版第3版的errata:
267:s /同样,浮点数促销用于创建浮点数的双打//
(注:表达式s / regexp / replacement /类似于 sed unix工具语义。它搜索模式 regexp 并用替换替换它。在我们的案例中没有。)