Запоминание приоритетов операторов vs постановка скобок
Недавно, проверяя домашние задания участников онлайн курсов, заметил, что иногда они сталкиваются с проблемами из-за того, что не используют скобки, например:
$a = false;
$b = true;
$c = $a xor $b;
Xor – исключающее ИЛИ, в данном случае переменной $c по логике должно быть присвоено значение true, однако, оператор присваивания имеет больший приоритет, чем xor, в результате чего
$c = $a xor $b;
отработает как
$c = $a;
Избежать ошибки можно было просто расставив скобки:
$c = ($a xor $b);
Однако, этот пример был слишком прост, давайте рассмотрим что-нибудь поинтереснее!
Сначала из области математики. Сколько будет
«два плюс два умножить на два плюс два плюс два умножить на два»?
Получи 12!? Или 24!? Согласитесь, что считать было бы гораздо проще, если бы мы расставили скобки: «(два плюс (два умножить на два)) плюс (два плюс (два умножить на два))»?
А теперь вернёмся к программированию. Представим, что у нас объявлены переменные:
$a = 2;
$b = 2;
$e = 0;
$f = true;
Ну-ка, подсчитайте за 20 секунд, чему будет равно значение переменной $c:
$c = $a++ + 2 <= --$b * 4 + $e && $f;
Как ощущения? True получили? Или false? Или некое целочисленное значение?
Когда операторы образуют последовательность, то все они выполняются согласно приоритетности. Приоритет операторов можно найти в любом справочнике по php, однако, гораздо проще воспользоваться скобками:
$c = ($a++ + 2) <= ((--$b * 4) + ($e && $f));
При такой записи становится понятно хотя бы то, что в переменную $c запишется булевское значение результата сравнения <=
Расстановка скобок имеет ряд преимуществ над запоминанием приоритетности операторов:
- расставить скобки проще, чем помнить приоритеты операторов
- позволяет избегать мелких ошибок (как в примере с xor)
- повышает читабельность кода
P.S. А всё-таки сколько будет «два плюс два умножить на два плюс два плюс два умножить на два»?
19.01.2015
Понравился материал? Поделись с друзьями!