双重使用表达式的括号初始化?

问题描述 投票:-2回答:2

我不习惯用括号初始化,但我想我会重新开始我的移植代码,因为它一直以来C ++ 11的标准。

其中一个问题是:是下面的表达式正确吗?

double MyFunction(double a,double b,int c)
{
    double dx{(a-b)/c};
    //do things to dx
    return dx;
}

我初始化双,DX,使用基于一个“双”减法的数学表达式和一个整数除法支架初始化。这只是感觉不对,虽然,像它可能会产生不确定的行为。上面的函数“正确的”,并且将它返回预期的不截断的价值?

或者,我可以尝试double dx{(a-b)/double(c)};double dx = (a-b)/(double(c));

c++ floating-point c++17 implicit-conversion arithmetic-expressions
2个回答
3
投票

double dx{(a-b)/c};是罚款。表达方式

(a-b)/c

对分裂和double在隔板的右手侧的左侧的类型int。通过usual arithmetic conversions在右手侧上的int被转换为double到左手侧匹配,然后分裂发生。这意味着你真的除以一个double一个double


1
投票

这只是感觉不对,虽然

然后随意这样做。复制初始化仍是C ++ 11并不会去任何地方。

像它可能产生不确定的行为

如果c==0,则行为将确实不确定的(至于标准而言。对于大多数真正的编译器,虽然,被零浮点除法并不UB)。否则没有。

上面的函数“正确”

的表达以及形成(如果没有你的编译器将需要它来告诉你),它有明确定义的行为(可能的前提下c!=0)。

并且将它返回预期的不截断的价值?

取决于你所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.