c ++与双精度和整数的隐式转换混淆

Gay*_*ord 1 c++

我一直在研究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;
}
Run Code Online (Sandbox Code Playgroud)

它的输出分别为:0,7和7.

在最后两个示例中,编译器隐式地将元素转换为双精度数,因此sum = 7.1,然后将其转换为int以获得7.

因为第一个例子也有双打,我希望所有这些元素也被转换为双精度,并且总和为2.0,然后被强制转换为2,但结果为0,所以看起来似乎是"1/2" "被视为整数,给出结果为0.我不确定这是编译器正在做什么,但这就是它的样子.

我认为如果任何元素是double,编译器会隐式地将所有元素转换为double.但是在第一种情况下不会发生这种情况.有人可以解释为什么编译器会以不同方式转换它们 谢谢.

lll*_*lll 9

我认为如果任何元素是double,编译器会隐式地将所有元素转换为double.但是在第一种情况下不会发生这种情况.

编号编译器逐步解析表达式,而不是整体解析.对于

i = 1 / 2 * 2 / 1. * 2. / 4 * 4;
Run Code Online (Sandbox Code Playgroud)

它被解析为i = ((1 / 2) * 2)....在第一个括号中,只有int,所以int应用了算术,它导致0.这个0使得整个表达式为0.


归档时间:

查看次数:

148 次

最近记录:

7 年,9 月 前