使用表达式对双精度进行括号初始化吗?

时间:2019-01-14 14:50:16

标签: c++ floating-point c++17 implicit-conversion arithmetic-expressions

我不习惯使用括号初始化,但是我认为我将开始移植代码,因为它自c ++ 11起就已成为标准。

出现一个问题:以下表达是否正确?

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

我正在使用括号初始化来初始化double dx,该初始化基于“ double”减法和整数除法的数学表达式。但是,这只是感觉不对,因为它可能会产生不确定的行为。上面的函数是“正确的”吗,它将返回不被截断的期望值吗?

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

2 个答案:

答案 0 :(得分:3)

double dx{(a-b)/c};很好。表达式

(a-b)/c

在分隔的左侧具有类型double,在分隔的右侧具有类型int。通过usual arithmetic conversions,将右侧的int转换为double以匹配左侧,然后进行除法。这意味着您实际上是将double除以double

答案 1 :(得分:1)

  

但是这只是感觉不对

然后随意不做。复制初始化仍在C ++ 11中,并且不会进行任何操作。

  

可能会产生不确定的行为

如果为c==0,则行为的确是不确定的(就标准而言)。但是对于大多数实际的编译器,浮点除以零并不是UB)。否则没有。

  

上述功能是否正确?

表达式的格式正确(如果不需要,则不需要编译器告诉您),并且具有明确定义的行为(可能以c!=0为前提)。

  

,它将返回不被截断的期望值吗?

取决于您的期望。