0

我继承了一些代码(从已经离开的人那里)并找到了这个小片段:

double minX = xVal.find('.') == string::npos ? (double)atoi(xVal.c_str()) : atof(xVal.c_str());
double minY = yVal.find('.') == string::npos ? (double)atoi(yVal.c_str()) : atof(yVal.c_str());

他选择将 atoi 用于整数类型有什么原因吗?我看不出有问题:

double minX = atof(xVal.c_str());
double minY = atof(yVal.c_str());

谢谢。

4

4 回答 4

4

真的,您不应该使用 atoi 或 atof。它们都已弃用,分别被 strtol 和 strtof 取代。

于 2014-03-10T11:47:58.000 回答
1

没理由。这些三元运算符是额外的。但它更好地使用strtod代替 atof - atof 不检测溢出和下溢错误。

于 2014-03-10T11:49:41.870 回答
0

他的代码是:double minX = (double)atoi(xVal.c_str());

然后他发现 float 存在并不假思索地修改了代码。

于 2014-03-10T11:50:24.723 回答
0

可能他被 atof 这个名字误导了,他忘记了它返回的是 double 而不是 float。如果 atof 返回一个浮点数,那么整数值的精度可能会有所损失。例如,在我的电脑上:

char buffer[20];
itoa(INT_MAX-113, buffer, 10);
double minXF = (float)atof(buffer);
double minXI = (double)atoi(buffer);    
std::cout << (int)minXF << std::endl;
std::cout << (int)minXI << std::endl;   

回报:

2147483520
2147483534

然而,由于 atof 返回一个 double,这一切都无关紧要,也没有真正的理由使用 atoi。因此,请根据其他答案使用安全的等价物,如果您碰巧看到他出去吃饭,可能会询问原作者。

于 2014-03-10T11:51:47.560 回答