Изучая языки программирования, вы могли узнать, что программа состоит из слов if, for, function, class и так далее. Приходило ли вам когда-нибудь в голову написать в программе вот так?
5;
Да, не if, не for, а просто единственная цифра 5.
Является ли это ошибкой? Попробуйте запустить программу. Можете, например, написать на Питоне так:
a = 5
b = 10
a
5
b
10
a - b
И не будет никакой ошибки, хотя написана какая-то бессмыслица. А что при этом сделает программа? Ничего. Если это не ошибка, тогда что это и зачем?
Работают такие вещи или нет – зависит от языка программирования. А точнее, от того, считает он их выражениями или нет.
Любая программа почти целиком состоит из выражений. Обычно выражения записываются примерно так:
d = b * b - 4 * a * c
или так:
$data = file_get_contents($tmpPath . '/' . basename($files[$i]));
Одно число или одна переменная – это самое простое выражение, которое можно записать. Из этого следует, что любое сложное выражение состоит из простых выражений.
У любого выражения есть значение. Значением выражения 15 - 5 является 10. Значением выражения 5 является просто 5, то есть оно само.
Всякий раз, когда транслятор программы определяет, что в тексте записано выражение, он сначала получает его значение и только потом использует его.
Например, мы выводим на печать a - b:
print a - b
Транслятор определяет, что a - b – это выражение, поэтому он сначала должен вычислить его значение. Он также видит, что это выражение состоит из двух других выражений – a и b. Поэтому он вычисляет значение выражения a, потом значение выражения b, и наконец значение выражения a - b. И только после этого вызывает функцию print, отдавая ей это значение. Если в результате вычисления a - b получилось 5, то значит, непосредственно в момент исполнения программы получится следующий вызов:
print 5
Вот ещё выражения:
a == b
a < b
a > b
a != b
Все они имеют значение, равное true (истина, 1) или false (ложь, 0)
Значит, если написать условие:
if (a == b) ...
То транслятор сначала вычислит значение выражения и получит true или false, и только потом подставит в if. Значит, в момент исполнения получится if (true) ... или if (false) ...
А можно ли написать вот так?
if (b * b - 4 * a * c) ...
Да, можно. Условный оператор if не ограничен только сравнениями. Он работает с любыми выражениями. То, что в скобках – выражение, у которого можно вычислить значение. Допустим, оно равно 0. Значит, в момент исполнения программы это будет выглядеть так:
if (0) ...
Но если в if используется только true или false, то что произойдёт с if (0) или if (5) или if ("hello")?
Многие (но не все) языки преобразуют числовые и строковые типы в логический так: 0 или "" это false, а всё остальное – true. Поэтому if (a) это для них то же самое, что if (a != 0).
А если взять условие без if и написать так?
a = b == c;
И так можно. Переменной a будет присвоено значение выражения b == c, то есть опять же true или false.
Если всё ещё непонятно, к чему я клоню – все выражения в программировании универсальны и могут использоваться где угодно. Нет такого правила, что в if надо обязательно писать ==, !=, >, <. Также нет такого правила, что переменной нельзя присвоить результат сравнения двух других переменных напрямую. Все выражения можно писать где угодно, хоть в адресах массивов, хоть в вызовах функций, хоть в заголовках циклов. Все они равноправны, и все они имеют значение.
Вместо такой записи:
if (a == b) c = true; else c = false;
вы можете написать так:
с = a == b;
Это абсолютно одно и то же.
Написав так:
5;
вы просто написали выражение (в таких языках как C, Python, JavaScript, PHP и многих других). И значит, это не ошибка. Это будет просто выражением, у которого значение 5. Это значение нигде не будет использовано, поэтому программа сразу же о нём забудет и станет выполняться дальше. А вот если написать так:
a = 5;
То значение выражения 5 будет сохранено в переменной a.
Смотрите на выражения шире, используйте их свободнее, и обнаружите много интересного.