我不习惯使用括号初始化,但是我认为我将开始移植代码,因为它自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));
答案 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
为前提)。
,它将返回不被截断的期望值吗?
取决于您的期望。