首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++隐式转换与doubles和int混淆

c++隐式转换与doubles和int混淆
EN

Stack Overflow用户
提问于 2018-02-22 05:45:23
回答 2查看 172关注 0票数 1

我一直在研究c++,我遇到了一个我不理解的隐式转换问题。在此代码中:

代码语言:javascript
运行
复制
#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。但在第一种情况下不会发生这种情况。有人能解释一下为什么编译器会转换成不同的代码吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-02-22 05:49:24

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

不是的。编译器会逐步解析表达式,而不是作为一个整体。为

代码语言:javascript
运行
复制
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;

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

票数 9
EN

Stack Overflow用户

发布于 2018-02-22 05:56:48

C++ operator precedence and associativity所述,*(乘法)和/(除法)具有相同的优先级和从左到右的结合性。所以他们从左到右解析,根据rules逐一确定每个操作的结果类型-注意Integral promotion部分(请注意,计算顺序是不同的,没有直接关系),如果你有其中一种类型,不是整个表达式都升级到double。因此,从逻辑上讲,这段代码:

代码语言:javascript
运行
复制
i = 1 / 2 * 2 / 1. * 2. / 4 * 4;

等于:

代码语言:javascript
运行
复制
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的类型。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48916009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档