使用表达式支撑双精度初始化?

Brace initialization of a double using an expression?

我不习惯使用大括号初始化,但我想我会开始移植我的代码,因为它自 c++11 以来就已成为标准。

出现一个问题:下面的表述是否正确?

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

我正在使用基于 'double' 减法和整数除法的数学表达式的大括号初始化来初始化双精度数 dx。不过,这感觉不对,就像它可能会产生未定义的行为一样。上面的函数是 'correct' 并且它 return 是没有截断的预期值吗?

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

double dx{(a-b)/c}; 没问题。表达式

(a-b)/c

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

This just feels wrong though

那就不做吧。复制初始化仍在 C++11 中,不会去任何地方。

like it may produce undefined behaviour

如果 c==0,那么行为确实是未定义的(就标准而言。虽然对于大多数真正的编译器来说,浮点除以零不是 UB)。否则没有。

Is the above function 'correct'

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

and will it return the value expected without truncation?

取决于您的期望。