在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;
}
Run Code Online (Sandbox Code Playgroud)
这用vc ++输出"int",用gcc输出"i".
但是用浮点数而不是短路来测试它,输出仍然是"浮动"或"f":
#include <iostream>
#include <typeinfo>
int main()
{
float a;
float b;
std::cout << typeid(a + b).name() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
根据Stroustrup,浮点提升规则没有例外,所以我期望输出"double"或"d".
关于促销的提到的部分是错误的还是某种程度上不清楚?关于类型促销,C++ 98和C++ 11有什么区别吗?
int*_*jay 29
我不知道Stroustrup的书到底是什么,但根据标准,s在这种情况下float不会被转换成doubles.在应用大多数算术二元运算符之前,应用5p9中描述的常规算术转换:
- 如果任一操作数具有作用域枚举类型(7.2),则不执行任何转换; 如果另一个操作数的类型不同,则表达式格式不正确.
- 如果任一操作数的类型为long double,则另一个操作数应转换为long double.
- 否则,如果任一操作数为double,则另一个操作数应转换为double.
- 否则,如果任一操作数是浮点数,则另一个操作数应转换为浮点数.
- 否则,应对两个操作数执行整体促销(4.5).[...]
积分促销是导致两个shorts转换为ints的原因.但是根据这些规则,两个floats不会被转换为doubles.如果添加float到double时,float将被转换为一个double.
以上内容来自C++ 11.C++ 03包含相同的规则,但引用范围枚举的规则除外.