在 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”。
但是用 float 而不是 Shorts 进行测试,输出仍然是“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 在类型提升方面有什么区别吗?
我不知道 Stroustrup 的书到底说了什么,但根据标准,float
s 不会被转换为double
在这种情况下。在应用大多数算术二元运算符之前,常见的算术转换5p9中描述的应用:
- 如果任一操作数是作用域枚举类型 (7.2),则不执行任何转换;如果另一个操作数没有相同的类型,则表达式的格式错误。
- 如果任一操作数的类型为 long double,则另一个操作数应转换为 long double。
- 否则,如果其中一个操作数为 double,则另一个操作数应转换为 double。
- 否则,如果其中一个操作数是浮点型,则另一个操作数应转换为浮点型。
- 否则,将对两个操作数执行积分提升 (4.5)。 [...]
积分促销有两个原因short
s 转换为int
s。但两个float
s 不会被转换为double
根据这些规则。如果您添加一个float
to a double
, the float
将被转换为double
.
以上来自C++11。 C++03 包含相同的规则,但引用作用域枚举的规则除外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)