我故意不在我的系统上编译和运行,因为这是可能依赖于编译器的类型。
This is not依赖于编译器。 C++明确定义了这些操作的顺序 http://en.cppreference.com/w/cpp/language/operator_precedence以及它们是如何转换的。
转换如何发生取决于操作的顺序。
double result1 = a + b / d + c; // equal to 4 or to 4.5?
在此示例中,首先发生除法。因为这是一个 int 除以 double,所以编译器通过将 int 转换为 double 来处理这个问题。因此,结果为b / d
是一个双。
C++ 做的下一件事是添加a
的结果b / d
。这是一个 int 与 double 相加,因此它将 int 转换为 double 并相加,得到一个 double。同样的事情发生在c
.
double result3 = a / b + d; // equal to 4 or to 4.5?
在此示例中,首先处理除法。a
and b
都是整数,所以不进行转换。的结果a / b
类型为 int 并且为 0。
然后,将其结果添加到d
。这是一个 int 加一个 double,所以 C++ 将 int 转换为 double,结果是一个 double。
即使这个表达式中存在双精度,a / b
首先求值,并且在执行到达 double 之前 double 没有任何意义。因此,发生整数除法。
我发现促销和转换规则相当复杂。通常,类似整数的数字(short、int、long)会提升为等价的浮点数(float、double)。但由于尺寸差异和符号,事情变得复杂。
See 这个问题 https://stackoverflow.com/questions/5563000/implicit-type-conversion-rules-in-c-operators有关转换的具体信息。