我不习惯用括号初始化,但我想我会重新开始我的移植代码,因为它一直以来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));
double dx{(a-b)/c};
是罚款。表达方式
(a-b)/c
对分裂和double
在隔板的右手侧的左侧的类型int
。通过usual arithmetic conversions在右手侧上的int
被转换为double
到左手侧匹配,然后分裂发生。这意味着你真的除以一个double
一个double
。
这只是感觉不对,虽然
然后随意这样做。复制初始化仍是C ++ 11并不会去任何地方。
像它可能产生不确定的行为
如果c==0
,则行为将确实不确定的(至于标准而言。对于大多数真正的编译器,虽然,被零浮点除法并不UB)。否则没有。
上面的函数“正确”
的表达以及形成(如果没有你的编译器将需要它来告诉你),它有明确定义的行为(可能的前提下c!=0
)。
并且将它返回预期的不截断的价值?
取决于你所期望的。