奇怪的条件陈述(相同的结果)

时间:2013-08-09 14:59:30

标签: 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));
}

2 个答案:

答案 0 :(得分:5)

此代码看起来不对。

我猜他们意味着更像这样的事情:

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的值,原始代码将失败。又一次打击它。

答案 1 :(得分:0)

代码为两个条件返回相同的输出。这只是一种冗余,而float(int(x))并没有说明问题。因为int(x)将数字转换为整数,再次将其转换为float或double没有区别,只会返回变量的类型。