在Stroustrup的新书《C编程语言-第四版》第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在类型促销方面有什么不同吗?
我不知道Stroustrup的书到底说了什么,但根据标准,在这种情况下,float
s不会转换为双精度。在应用大多数算术二进制运算符之前,应用5p9中描述的常见算术转换:
积分提升是导致两个短的s转换为int的原因。但是根据这些规则,两个浮的s不会转换为双的。如果将浮点值添加到双精度浮点值,则浮点值将转换为双精度浮点值。
以上来自C 11。C 03包含相同的规则,但涉及作用域枚举的规则除外。
与此同时,Stroustrup似乎意识到引用句是不正确的,或者至少是误导性的。他已经从第10.5.1节中删除了关于浮点提升的句子。
请在Stroustrup的网页上查看第4版第3次印刷的勘误表:
PG 267: s/同样,浮点提升用于从浮点数中创建双打//
(备注:表达式s/regexp/replacement/类似于sed-unix工具语义。它搜索模式regexp并用replacement替换。在我们的例子中没有任何内容。)