奇怪的条件语句(结果相同)
Weird conditional statement (same result)
通过一些代码,我发现:
#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
当然,?:运算符在每种情况下总是返回一个相同的值,而不管其条件表达式如何。另一方面,我想作者有理由这样写这些函数;不过我找不到。知道吗?这只是一个错误(打字错误)吗?
[EDIT]作者回复:
好的一点-这只是从round()。以下内容应该很好(除了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)总是执行截断,所以即使这样?:
的两个分支也应该产生相同的结果。
如果舍入模式对typecast有影响(经过思考,我不确定它是否有影响),您可能真的想使用modf
、modff
或modfl
这样的函数将数字分解为整数和小数部分,并丢弃小数部分。
例如:
inline float trunc(float x)
{
float int_part;
modf(x, &int_part);
return int_part;
}
编辑:另一个观察。对于不适合int
的值,原始代码将失败。又一次打击。
代码为这两个条件返回相同的输出。这只是一个冗余,而且float(int(x))
也没有什么意义。因为int(x)
将数字转换为整数,所以再次将其转换为浮点或双精度并没有什么区别,只是返回变量的类型不同。
相关文章:
- 三元运算符在返回语句中给出意外的结果
- 为什么语句中的链接方法无法给出预期的结果?
- 使用嵌套 if 语句的意外结果
- 单个cout中的多个语句产生不同的结果
- 如果语句计算结果为 false,即使条件为真
- python 和 c++ 的结果对于嵌套的 for 语句是不同的
- EXPECT_NO_THROW语句的 gtest 捕获结果
- C++ to_string函数根据额外打印语句的先见之明,为浮点数和整数转换提供不同的结果
- 当我使用if语句时,为什么该程序会给我不同的结果
- 如何在QtCreator中基于SqlQuery结果执行条件语句
- 嵌套循环语句结果不正确
- 实现多个返回语句 c++ 时出现奇怪的结果
- 如何在更新语句中获取输出子句的结果
- 为什么我的 if/else 语句没有产生预期的结果?
- 奇怪的条件语句(结果相同)
- 如果.还.语句不输出预期结果.而.循环问题
- 调用函数只有在函数开头有cout语句时才会给出结果
- 在语句中调用 std::set 函数时出现意外"if"评估结果
- 我们是否可以假设下列任意一对浮点算术语句总是产生相同的结果?
- 在c++中,一些宏语句可能会产生意想不到的结果