c++ - 奇怪的条件语句(相同的结果)

标签 c++ conditional-statements

通过一些代码,我发现了这个:

#ifdef trunc
# undef trunc
#endif
inline float trunc(float x)
{
    return (x < 0.0f) ? float(int(x)) : float(int(x));
}
inline double trunc(double x)
{
    return (x < 0.0f) ? double(int(x)) : double(int(x));
}
inline long double trunc(long double x)
{
    return (x < 0.0f) ? (long double)(int(x)) : (long double)(int(x));
}
#endif // _WIN32

当然,无论其条件表达式如何,?: 运算符在每种情况下始终返回一个相同的值。 另一方面,我猜作者这样写这些函数也是有他的理由的;但我找不到一个。任何想法 ?这只是一个错误(打字错误)吗?

[编辑]作者回复:

好点 - 这只是对定义的过度热心剪切和粘贴 圆形的()。以下应该没问题(除了对 int 范围):

inline float trunc(float x)
{
    return float(int(x));
}
inline double trunc(double x)
{
    return double(int(x));
}
inline long double trunc(long double x)
{
    return (long double)(int(x));
}

最佳答案

这段代码看起来有问题。

我的猜测是他们的意思更像是这样的:

inline float trunc(float x)
{
    return (x < 0.0f) ? -float(int(-x)) : float(int(x));
}

但即使这样也值得怀疑。我相信 int(x) 总是执行截断,所以即使这样 ?: 的两个分支应该会产生相同的结果。

如果舍入模式确实对类型转换很重要(经过片刻的思考,我不确定它是否重要),您可能真的想使用像 modf 这样的函数, modffmodfl将数字分解为整数和小数部分,并丢弃小数部分。

例如:

inline float trunc(float x)
{
    float int_part;
    modf(x, &int_part);
    return int_part;
}

编辑:另一项观察。对于不适合 int 的值,原始代码将失败。 。又一次打击它。

关于c++ - 奇怪的条件语句(相同的结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149737/

相关文章:

c++ - 对于循环数组迭代,if循环测试索引是否为真/假,错误地评估真

c++ - 找到字符串模式的更好解决方案?

MYSQL随机选择3条记录,其中至少一条记录字段具有特定值

excel - 如何在Excel中根据多个特定文本设置条件格式

c++ - 错误 : invalid parameter type ‘void’

C++ - 未解析的外部符号

c++ - 嵌套模板类和全局命名空间中的函数

bash - 如何使用 bash 检查一个文件是否为空而另一个文件不处于一种状态

python - 映射数组中满足条件的位置

python - 基于多列值的重复键对两个大型 Pandas DataFrame 进行条件合并/连接 - Python