29

是否存在一种浮点数据类型(例如double)确保所有 +、-、*、/、% 等数学运算都采用双操作数?

如果故事比这更复杂,是否有描述这些规则的资源?我应该不问这样的问题,并且总是明确地int转换到double等式的结果是什么时候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?
4

4 回答 4

44

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

依赖于编译器。C++ 清楚地定义了这些操作的顺序以及它们是如何转换的。

转换如何发生取决于操作的顺序。

double result1 = a + b / d + c; // equal to 4 or to 4.5?

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

C++ 做的下一件事是ab / d. 这是一个加到 double 的 int,因此它将 int 转换为 double 并相加,得到一个 double。同样的事情发生在c.

double result3 = a / b + d; // equal to 4 or to 4.5?

在本例中,首先处理除法。a并且b都是整数,因此不进行任何转换。的结果a / b是 int 类型,为 0。

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

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

我发现促销和转换规则非常复杂。通常,类似整数的数字(short、int、long)被提升为等效的浮点数(float、double)。但是由于大小差异和符号,事情变得复杂了。

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

于 2012-12-01T21:04:44.430 回答
10

是否将方程式中的double每一项提升为?intdouble

不,只有单个操作的结果(相对于优先级)。

double result1 = a + b/d + c; // equal to 4 or to 4.5?

4.5.

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?

3.75。

double result3 = a/b + d; // equal to 4 or to 4.5?

4.

于 2012-12-01T20:42:07.483 回答
3

您必须考虑每个运算符的优先级,您必须像解析器一样思考:

double result1 = a + b/d + c; // equal to 4 or to 4.5?

这就像一个 + (b/d) +c 因为'/'运算符具有最大的优先级。那么这两个操作中的哪个首先进行并不重要,因为浮点操作数在中间,它“感染”其他操作数并使它们成为双倍。所以它是 4.5。

double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  

这里也一样,就像 ((a+b)/d )+c,所以 a+b 是 3,那 3 变成了一个浮点数,因为被提升为 double,因为是 d 的被除数,它是一个 double,所以它是 0.75+3,即 3.75。

double result3 = a/b + d; // equal to 4 or to 4.5?

就像 (a/b)+d,所以 a/b 是 0,d 是 4,所以是 4。解析器按优先级顺序进行所有操作,因此您可以准确地知道表达式的结果。

于 2012-12-01T21:16:47.350 回答
1

一般情况下,如果二元运算符的一个操作数是浮点数,另一个是整数,则将整数转换为浮点数,结果为浮点数。

在具有多个子表达式的复合表达式中,每个运算符都使用您可能知道的优先规则单独处理。因此, in a*b + c*d,a*b被评估,并且c*d被评估,并且结果被加在一起。里面的任何东西c*d都没有效果,a*b反之亦然。

当然,C++ 很复杂,用户定义的运算符可能还有其他行为。

定义规则的权威资源是 C++ 标准。该标准相当大而且技术性很强。您可能更愿意先检查 C 标准。有关标准的链接,请参阅此答案。任何关于 C 或 C++ 的好书都应该描述默认的类型转换和表达式求值。

于 2012-12-01T20:53:07.073 回答