是否有一个双重推动等式中的每个int加倍?

Ala*_*ing 20 c++ floating-point type-conversion integer-promotion

是否存在一个浮点数据类型(例如double)确保所有+, - ,*,/,%等数学运算都假定为双操作数?

如果故事比这更复杂,是否有描述这些规则的资源?我不应该问这样的问题,总是明确地转换intdouble当公式的结果double.这是我正在考虑的一些方程式.我故意不在我的系统上编译和运行,因为这是可能依赖于编译器的类型.

int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?    
double result3 = a/b + d; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)

小智 36

我故意不在我的系统上编译和运行,因为这是可能依赖于编译器的类型.

依赖于编译器.C++清楚地定义了这些操作顺序以及它们的转换方式.

转换的发生方式取决于操作顺序.

double result1 = a + b / d + c; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)

在这个例子中,除法首先发生.因为这是一个int除以double,编译器通过将int转换为double来处理这个问题.因此,结果b / d是双倍的.

C++所做的下一件事是添加a到结果中b / d.这是一个添加到double的int,因此它将int转换为double并添加,从而产生double.同样的事情发生在c.

double result3 = a / b + d; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)

在此示例中,首先处理除法.a并且b都是整数,因此不进行转换.结果为a / bint类型,为0.

然后,将其结果添加到d.这是一个int加一个double,所以C++将int转换为double,结果是double.

即使在此表达式中存在double,a / b也会首先计算double,而double在执行到达double之前没有任何意义.因此,发生整数除法.

我发现促销和转换规则相当复杂.通常类似整数的数字(short,int,long)被提升为浮点数(float,double).但是尺寸差异和符号使事情变得复杂.

有关转换的详细信息,请参阅此问题.


小智 9

是否会double促进int等式中的每一个double

不.只有单个操作的结果(关于优先级).

double result1 = a + b/d + c; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)

4.5.

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
Run Code Online (Sandbox Code Playgroud)

3.75.

double result3 = a/b + d; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)

4.