Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 浮点常量比较-(0.0?1:0)_C_Windows_Visual Studio_Floating Point - Fatal编程技术网

C 浮点常量比较-(0.0?1:0)

C 浮点常量比较-(0.0?1:0),c,windows,visual-studio,floating-point,C,Windows,Visual Studio,Floating Point,在下面的示例中,如果取消注释float f=0.0, 并替换返回(0.0?1:0)带返回(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
并替换
返回(0.0?1:0)
返回(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;
}
  • 为什么
    my_func()
    返回值
    true
    (1)
  • C编译器如何解释这个表达式
    (0.0?1:0)

返回(0.0?1:0)编译为固定返回1。在另一种情况下,实际评估了浮点变量,0.0并不等于0。

这看起来像是Microsoft编译器中的一个bug,您应该提交给它。我可以在Visual Studio Express 2010中复制它,但在gcc中无法复制:


任何计算结果为整数值
0
的表达式都应等效于
false
。这正是它如何处理
float
变量的,当我尝试使用
双精度
时也是如此。

这实际上是您面临的现实问题吗?这是您在实际代码中可能会做的事情吗?:-)我刚刚运行了相同的代码,得到了“NIL”,这只是一个偶然的机会——也许你的编译器正在比较十六进制值而没有截断?ex.(int)0相当于0x000000,但使用浮点精度时,您可能不会精确到该值value@Jim,当转换为
bool
时,无论内部表示是什么,
0.0
不应该总是变成
false
?如果它是一个正常的整数转换,它应该截断为
0
@chux My bad,混淆了。今天我看了太多的代码。在条件中计算
0.0
应与
0
进行比较,但我不确定这是否取决于我同意的编译器(可能截断也可能不截断)。(顺便说一句,比我快了3分钟)注意,float_expr:expr1:expr2中没有转换为整数类型。相反,条件表达式的第一个表达式必须具有标量类型,并与该类型的零进行比较(C11中的6.5.15:4)。如果(0.5)printf(…);不打印(如果(-0.0)printf(…);不打印)。即使使用
/Od
也可以检查程序集列表…它直接删除
(0.0?1:0)
并添加
mov eax,1
。我会说是虫子。将文本
0.0
放置在if expr中会导致生成相应的程序集(即使进行了优化)。@user7116我还能够验证Visual Studio 2012的工作原理是否相同,尽管我没有最新的service pack。“任何计算结果为整数值0的表达式都应等同于
false
”是的,但不完整。任何比较为0的表达式都为false
0.0
的计算结果不是0的整数值(或任何其他整数值),但它确实与
0
进行比较。(比较将
int
0
转换为
double
ONE