Программирование на языке C для начинающих: Логические выражения

В этом параграфе рассмотрим более подробно логические операции в языке C, их приоритеты и то, каким образом, происходит обработка логических выражений. 

Операции сравнения

В языке C существуют следующие операции сравнения:

< - меньше
> - больше
<= - меньше или равно
>= - больше или равно
== - равно (эквивалентно)
!= - не равно (не эквивалентно)

Всеми этими операциями можно пользоваться в оператаоре if наравне с теми, что Вы видели в примерах выше.

Задание: форкните http://ideone.com/EOerwd и придумайте 10 примеров операторов if, в которых задействованы указанные операции и получается указанный результат:

  1. используя операцию <, получите значение true;
  2. используя операцию <=, получите значение true;
  3. используя операцию !=, получите значение true;
  4. используя операцию ==, получите значение true;
  5. используя операцию >=, получите значение true;
  6. используя операцию <=, получите значение false;
  7. используя операцию !=, получите значение false;
  8. используя операцию >=, получите значение false;
  9. используя операцию >, получите значение false;
  10. используя операцию ==, получите значение  false.

Обратите внимание, что в результате у Вас должен получиться такой вывод:

0. True
1. True
2. True
3. True
4. True
5. True
End

Результат логической операции

Результатом логической операции в языке C является целое число, которое может иметь одной их двух значений: либо 0 либо 1. Посмотрите исходный текст программы: http://ideone.com/C8IL7w и попробуйте ответить на вопрос: что будет напечатано в консоли в результате работы этой программы?

Правильный ответ:

1
0

Результат первого выражения: истина, результат второго выражения: ложь. Однако, в консоли мы видим значения 1 и 0. Можно было бы подумать, что дело в том, что мы используем формат печати целых чисел в функции printf, который обознается форматом %d, но, во-первых, формата для печати логических значений не существует, а, во-вторых, в языке C результат любой логической операции это, на самом деле, целое число. Разработчики языка C изначально даже не стали добавлять такой типа данных.

Замечу в скобках, что отдельный логический тип данных в языке C все же существует, но появился он только в стандарте языка C 99-го года. Однако, особого смысла этот тип данных не имеет, так как, внутри он все равно представляет собой обычный целый тип. Кстати, до сих существуют компиляторы языка C, которые не полностью поддерживают стандарт языка C99, не говоря уж про C11.

Поскольку это просто целый тип данных, то мы можем сделать, например такое:

int a;
a = 2<3;

В переменной a будет записано значение 1.

Приоритеты операций отношения

Так же, как и для арифметических операций, для операций отношения определены приоритеты, в соответствии с которыми определяется последовательность выполнения этих операций. Так же, как и для арифметических операций уровней приоритетов для операций отношения всего два:

  1. < (меньше), <= (меньше или равно), => (больше или равно), > (больше)
  2. == (равно), != (не равно)

Приоритеты записаны по мере убывания, то есть, приоритет операции “меньше”, выше, чем приоритет операции “равно”.

Например, выражение:

1 != 2 < 3

будет вычислено в таком порядке:

1 != (2 < 3)

В результате вычисления данного выражения получим значение 0. Еще раз остановимся, что бы понять, как мы получили такой результат. Выражение

2 < 3

дает нам результат Истина, то есть, 1. Теперь сравним полученное значение с числом слева от операции !=.

1 != 1

В результате вычисления этого выражения получаем Ложь, то есть, 0.

Обратите внимание, что если бы приоритеты были иными, то есть, выражение вычислялось бы вот так:

(1 != 2) < 3

то мы получили бы значение Истина, то есть, 1.

Вообще говоря, такие приоритеты операций не являются абсолютно понятными с первого раза. Поэтому, для исключения всяких сомнений, лучше в исходном тексте использовать скобки.

Приоритеты операций отношения по сравнению с арифметическими операциями

Как нетрудно догадаться арифметические операции и операции отношения можно использовать в одном выражении. Например:

int a = 10;
int b = 95;
if (a + 5 < b/10)
...

В этом случае важно знать как операции отношения соотносятся с другими операциями в смысле приоритетов операций. Здесь все проще и логичнее: приоритеты арифметических операций выше, чем приоритеты операций отношения. То есть, в приведенном выше примере сперва будет вычислена операция умножения, затем операция вычитания, и лишь затем будет вычислена операция “меньше” для полученных значений. Кстати, результат вычисления выражения получается Ложь, то есть, 0.

Задание: форкните http://ideone.com/YiSOpe и запишите примеры, пяти выражений, в каждом из которых используется не менее двух операций, из которых, хотя бы одна это операция отношения.

Логические выражения и оператор if

Посмотрите исходный текст: http://ideone.com/PC9hFw. Как Вы думаете, этот исходный текст корректный? Если да, то каков будет результат?

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

Выше мы говорили, что результатом логической операции может быть или 0 или 1. А в данном случае, результат вычисления выражения в круглых скобках опеаратора if равен 12, и, тем не менее, это работает!  Почему такое происходит?

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

Принципиальное требование оператора if, что бы выражение было или целочисленным или приводимым к целочисленному. Если в результате вычисления выражения получается целое число 0, то это считается Ложь, в любом другом случае – Истина. Поэтому, значение 12, которое мы получаем в предыдущем примере, это Истина, и следовательно, выполняется оператор внутри if.

Благодаря этой особенности, даже такое выражение в языке C вполне корректно, хотя, чаще всего и не имеет особого смысла:

if (2)
...

Следующий параграф

К оглавлению

Лицензия

Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)

Programming in C for beginners by Sergey Borisov (AKA risik) is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

Программирование на языке C для начинающих автор Сергей Борисов (AKA risik) доступна на условиях лицензии Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

One thought on “Программирование на языке C для начинающих: Логические выражения”

Leave a Reply