2017-01-15 22 views
-2

У меня есть следующий код. Это демонстрирует проблему, с которой я сталкиваюсь. Почему сравнение не оценивается как истинное? Является ли это ограничением целочисленных и с плавающей запятой?C++ сравнение целых чисел с float

#include <iostream> 

int main(){ 

    double m = -0.625; 
    if((-1)<=m<=0){ 
     std::cout << "Enter here" <<std::endl; 
    } 
    return 0; 
} 
+0

Вы не можете цепные операторы сравнения, как, что в C++, или в большинстве языков. Python - единственный язык, который я знаю, который позволяет это. – user2357112

+0

ahhh Я вижу .... Это объясняет, почему – Belphegor

+0

Вам не нужны круглые скобки вокруг '-1'. –

ответ

2

Вы не можете сделать трехходовое сравнение подобного в C. Измените его на следующий, и он будет работать:

if((-1) <= m && m <= 0){ 
     std::cout << "Enter here" <<std::endl; 
    } 
0

состояние, в этом случае оператор

if((-1) <= m <= 0){ 

эквивалентен

if((-1 <= m) < = 0){ 

as -1 меньше, чем m то Подвыражение (-1 <= m) выходами 1 в C и true в C++, который затем преобразуется в 1 и Подвыражение 1 <= 0 дает 0 в C и false в C++ ..

Чтобы получить ожидаемый результат вы должны написать вместо

if(-1 <= m && m <= 0){ 
0

в C++ -1 <= m <= 0 эквивалентно (-1 <= m) <= 0.

В этом примере, -1 неявно преобразуется в float для того, чтобы использовать оператор <= с m. Результатом этого выражения является bool. Этот результат затем неявно преобразуется в int, чтобы использовать оператор <= с 0. Поскольку bool преобразуется в 0 или 1 (false или true), этот условный оператор будет действителен только тогда, когда m составляет менее -1.

Имеет смысл с математической точки зрения структурировать оператор if, как это, однако вы должны разбить его явно, чтобы компилятор знал, чего вы хотите.

Попробуйте

-1 <= m && m <= 0