使用表达式支撑双精度初始化?
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?
取决于您的期望。
我不习惯使用大括号初始化,但我想我会开始移植我的代码,因为它自 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?
取决于您的期望。