Сравнение констант с плавающей запятой - (0,0 × 1: 0)

В приведенном ниже примере, если uncomment 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)?

Ответ 1

Это похоже на ошибку в компиляторе Microsoft, который вы должны отправить в Connect. Я смог дублировать его в Visual Studio Express 2010, но не в gcc: http://ideone.com/8qPRJd.

Любое выражение, которое оценивает целочисленное значение 0, должно быть эквивалентно false. Именно так он работает с переменной float, и это то же самое, когда я пробовал его с помощью double.

Ответ 2

return (0.0? 1: 0), скомпилированный с фиксированным возвратом 1. В другом случае переменная с плавающей запятой была фактически оценена, а 0.0 не равнялась 0.