Операторы сравнения
Символы < и >, которые вы уже использовали в условиях, — это операторы сравнения: они сравнивают два значения, и результат — истина или ложь. В C их шесть:
==равно:5 == 5!=не равно:5 != 3>больше:5 > 3<меньше:3 < 5>=больше или равно:5 >= 5<=меньше или равно:3 <= 5
Все примеры в списке истинны. В !=, >= и <= знак равенства всегда стоит вторым, без пробела. Следите за разницей между > и >= на границе: 18 > 18 ложно, а 18 >= 18 истинно. Поэтому «18 лет или старше» записывается как age >= 18.
«Равно» записывается двумя знаками равенства, ==, потому что у одного уже есть своя работа: points = 10 присваивает, то есть сохраняет 10 в переменной points. А points == 10 сравнивает: спрашивает, лежит ли в points число 10, и ничего не меняет.
Написать = вместо == в условии — одна из самых частых ошибок. На этом сайте компилятор её ловит:
#include <stdio.h>
int main(void) {
int points = 7;
if (points = 10) {
printf("Максимум баллов!\n");
}
printf("Баллы: %d\n", points);
return 0;
}Компилятор сообщает:
main.c:6:16: error: using the result of an assignment as a condition without parentheses [-Werror,-Wparentheses]
6 | if (points = 10) {
| ~~~~~~~^~~~
main.c:6:16: note: place parentheses around the assignment to silence this warning
6 | if (points = 10) {
| ^
| ( )
main.c:6:16: note: use '==' to turn this assignment into an equality comparison
6 | if (points = 10) {
| ^
| ==
1 error generated.points = 10 в условии ничего не сравнивает. Оно сохранило бы 10 в points, а затем использовало бы это число 10 как условие, то есть как истину. Блок выполнялся бы каждый раз, что бы ни лежало в points раньше. В других местах компиляторы C обычно пропускают такое самое большее с предупреждением, и программа тихо начинает работать неправильно. Здесь это ошибка, так что вы узнаёте о ней сразу. (Конец первой строки в квадратных скобках просто называет проверку, которая нашла проблему.)
Под ошибкой компилятор добавляет два примечания — строки с note:, — которые предлагают исправления. Второе из них здесь верное: использовать ==. Первое, про скобки, предназначено для редкого случая, когда кто-то действительно хочет сохранить значение прямо в условии, поэтому ему следовать не нужно.
Сравнивать можно не только числа, но и символы. Символ записывается в одинарных кавычках:
char size = 'M';
if (size == 'M') {
printf("Ваш размер есть\n");
}Программа выведет:
Ваш размер естьЗаглавные и строчные буквы — это разные символы, поэтому 'm' == 'M' ложно. Сравнение целых текстов в C устроено иначе; как именно, вы узнаете в уроке о строках.
Будьте осторожны с == и десятичными числами. Компьютер хранит большинство из них лишь приближённо, поэтому даже 0.1 + 0.2 == 0.3 ложно. Для double лучше сравнивать с помощью <, >, <= или >=.
Задание
- 1
Интернет-магазин дарит подарок сотому покупателю. Запустите программу и прочитайте первую строку ошибки: она говорит, где проблема и в чём она состоит. Исправьте условие так, чтобы оно сравнивало. Тогда программа выведет
Покупатель номер 57. - 2
Магазин доставляет бесплатно, если заказ стоит 1000 или больше. Под последним
printfсоздайте переменнуюorder_totalтипаintсо значением1000и напишите инструкциюifс веткойelse: еслиorder_totalне меньше 1000, выведитеБесплатная доставка, иначе выведитеДоставка стоит 99. Заказ ровно на 1000 тоже доставляется бесплатно, так что выбирайте оператор внимательно. Программа выводит:Покупатель номер 57 Бесплатная доставка