Найти в Дзене
ZDG

В программировании всё имеет значение

Оглавление

Изучая языки программирования, вы могли узнать, что программа состоит из слов 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.

Смотрите на выражения шире, используйте их свободнее, и обнаружите много интересного.

Продолжение