【发布时间】:2013-08-02 03:09:24
【问题描述】:
在下面的例子中,如果取消注释float f = 0.0;,
并将return(0.0 ? 1 : 0); 替换为return(f ? 1 : 0);。
输出为NIL。
这是我的代码:
/* file main.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
cl -W4 -MTd -O2 -TC main.c -Fetest */
#include <stdio.h>
int my_func(void)
{
/* float f = 0.0; */
return(0.0 ? 1 : 0);
}
int main(void)
{
printf("%s\n", ( my_func() ? "ONE" : "NIL") );
return 0;
}
在 32 位 Windows 机器上,使用 Visual Studio 输出此代码:
ONE
- 为什么
my_func()返回值true(1)? - C 编译器如何解释这个表达式
(0.0 ? 1 : 0)?
【问题讨论】:
-
这实际上是您面临的现实问题吗?这是您在实际代码中可能会做的事情吗? :-)
-
我只是运行相同的代码并得到“NIL”
-
只是在黑暗中拍摄——也许您的编译器正在比较十六进制值而不截断?前任。 (int) 0 等价于 0x000000,但使用浮点精度,你可能不会落在那个确切的值上
-
@Jim,无论内部表示是什么,
0.0转换为bool时不应该总是变成false吗?如果它是一个普通的整数转换,它应该被截断为0。 -
@chux 我的错,搞混了。我今天看了太多代码。在有条件的情况下评估
0.0应该与0进行比较,但同样,我不确定这是否取决于编译器(可能会或可能不会截断)
标签: c windows visual-studio floating-point