在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”。
但是用浮点数而不是短路数来测试它,输出仍然是"float“或"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有什么区别吗?
发布于 2013-06-20 22:02:32
我不知道Stroustrup的书到底说了什么,但根据标准,在这种情况下,floats不会被转换为doubles。在应用大多数算术二元运算符之前,将应用5p9中描述的常用算术转换:
积分提升会导致两个short%s转换为int%s。但根据这些规则,两个float%s将不会转换为double%s。如果您将float添加到double,则该float将转换为double。
以上代码来自C++11。C++03包含相同的规则,除了引用范围枚举的规则。
发布于 2014-09-21 02:57:38
与此同时,Stroustrup似乎认识到refer语句是不正确的,或者至少是误导性的。他从第10.5.1节中删除了关于浮点升级的句子。
请在Stroustrup的网页上查看第四版第三次印刷的errata:
pg 267: s/同样,浮点提升用于在浮点数之外创建双精度浮点数//
(备注:表达式s/regexp/替换/类似于sed unix工具语义。它搜索模式regexp并将其替换为替换。在我们的案例中没有任何东西。)
https://stackoverflow.com/questions/17215484
复制相似问题