Сравнение констант с плавающей запятой - (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.