Математическая цепочка оператора сравнения – как и в случае, если ((5 <j <= 1)) "

int j=42; if( (5<j<=1) ) { printf("yes"); } else { printf("no"); } 

Вывод:

 yes 

Почему он выводит да?
Разве это условие не является абсолютным?

C не понимает математический синтаксис, поэтому

 if(1 

не интерпретируется так, как вы ожидаете и хотите; должен быть

 if (1 < j && j <= 5) 

или похожие.

Как объяснено в других ответах, выражение оценивается как

  ((1 < j) <= 5) => ("true" <= 5) => "true" 

где «true» (логическое значение) неявно преобразуется в 1, например, здесь , например, со ссылками на стандарты, и это объясняет, почему «истина» должна быть «меньше» 5 (хотя в C может быть не совсем корректно говорить о «неявном преобразовании из bool в int»)

В соответствии с приоритетом оператора и ассоциативностью LR,

1 оценивается до 1

1<=5 - 1

 if(1) { printf("yes") 

Ваш вопрос немного сломан, но я считаю, что следующее разъяснит, что происходит для вас:

В C 1 < j <= 5 означает то же самое, что (1 < j) <= 5 . И значение 1 < j равно 0 или 1 в зависимости от того, меньше или равно 1 или строго больше 1. Так вот что происходит для нескольких значений j в вашем коде:

Если j == 0 , это выражение равно (1 < 0) <= 5 , что сводится к 0 <= 5 (поскольку 1 < 0 ложно). Это истинное выражение. Ваша программа выводит «да».

Если j == 3 , это выражение равно (1 < 3) <= 5 , что сводится к 1 <= 5 (поскольку 1 < 3 истинно). Это истинное выражение. Ваша программа выводит «да».

Если j == 6 , это выражение равно (1 < 6) <= 5 , что сводится к 1 <= 5 (потому что 1 < 6 истинно). Это истинное выражение. Ваша программа выводит «да».

Во всех случаях ваша программа выводит «да», потому что 1 < j является либо 0, либо 1, и в любом случае оно меньше 5.

То, что вы должны были использовать, - 1 < j && j <= 5 .

вы хотите написать, if ( 1 < j && j <= 5 )

что происходит в вашем случае: if ( 1 < j <=5 )
1 < j сначала оценивается, и это верно, поэтому оно оценивается как 1, и ваше условие становится
if (1 <=5) , что также верно, так printf("yes"); получает извинение

Interesting Posts

Как я могу использовать HTTP / SSH для моего сервера с моим публичным IP-адресом за маршрутизатором?

Могу ли я создать пользователя SSH, который может получить доступ только к определенному каталогу?

Использование переменной в предложении LIMIT в MySQL

Как отображать сообщения из jQuery Подтвердить плагин внутри всплывающих подсказок Tooltipster?

ASP.NET MVC: управление сериализацией имен свойств с помощью JsonResult

рекомендовать библиотеку / API для распаковки файла в C #

Постоянное амортизированное время

HQL присоединился к запросу, чтобы получить большое количество связей

Как подключить несколько устройств к интернет-провайдеру, который предоставляет веб-портал для входа?

Когда использовать конструктор и когда использовать метод getInstance () (статические заводские методы)?

Как сделать Ubuntu VM в VirtualBox доступным из Интернета?

Объединение нескольких текстовых файлов в один

ASP.Net MVC Custom Model Binding пояснение

Построить на TFS 2013 не удалось, но нормально локально

Как отклонить индикатор выполнения, даже если нет представления о заполнении в FirebaseListAdapter?

Давайте будем гением компьютера.