我一直在研究c++,我遇到了一个我不理解的隐式转换问题。在此代码中:
#include <iostream>
using namespace std;
int main(){
int i;
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;
cout << i << endl;
i = 3.5 + 2 + 1.6;
cout << i << endl;
i = 2 + 3.5 + 1.6;
cout << i << endl;
return 0;
}输出分别为: 0,7和7。
在最后两个示例中,编译器隐式地将元素转换为双精度,因此sum = 7.1,然后将其转换为int以得到7。
因为第一个示例也有doubles,所以我希望所有这些元素都转换为doubles,并且sum为2.0,然后强制转换为2,但结果为0,因此似乎"1/2“被视为整数,结果为0。我不确定这是编译器在做什么,但它看起来就是这样。
我认为如果有任何元素是double,编译器会隐式地将所有元素转换为double。但在第一种情况下不会发生这种情况。有人能解释一下为什么编译器会转换成不同的代码吗?谢谢。
发布于 2018-02-22 05:49:24
我认为如果有任何元素是double,编译器会隐式地将所有元素转换为double。但在第一种情况下不会发生这种情况。
不是的。编译器会逐步解析表达式,而不是作为一个整体。为
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;它被解析为i = ((1 / 2) * 2)...。在第一个括号中,只有int,所以应用了int算法,这导致0。这个0使整个表达式为0。
发布于 2018-02-22 05:56:48
如C++ operator precedence and associativity所述,*(乘法)和/(除法)具有相同的优先级和从左到右的结合性。所以他们从左到右解析,根据rules逐一确定每个操作的结果类型-注意Integral promotion部分(请注意,计算顺序是不同的,没有直接关系),如果你有其中一种类型,不是整个表达式都升级到double。因此,从逻辑上讲,这段代码:
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;等于:
auto a = 1 / 2; // a - int
auto b = a * 2; // b - int
auto c = b / 1.; // c - double
auto d = c * 2.; // d - double
auto e = d / 2; // e - double
auto f = e * 4; // f - double
i = f;并且分别确定每个变量a-f的类型。
https://stackoverflow.com/questions/48916009
复制相似问题