Видеокурсы по изучению языка программирования Swift. Подробнее

Приоритет и ассоциативность

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

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

Оператор ассоциативности определяет то, как операторы одного приоритета сгруппированы вместе (или ассоциированы друг с другом), то есть либо они сгруппированы слева, либо справа. Думайте об этом как “они связаны с выражением слева” или “они связаны с выражением справа”.

Это важно учитывать приоритет и ассоциативность каждого оператора, когда работаете с порядком, в котором должно считаться выражение. Вот простой пример. Почему данное выражение имеет равенство 17?

2 + 3 % 4 * 5
// это равно 17

Если вы прочитаете это выражение строго слева направо, то вы можете ожидать действия в таком порядке:

  • 2 плюс 3 равняется 5
  • 5 остаток от деления на 4 равен 1
  • 1 умножаем на 5 и получаем 5

Однако, как не крути, правильный ответ равен 17, а не 5. Операторы более высокого приоритета выполняются раньше операторов более низкого приоритета. В Swift, как и в C, оператор умножения (*) и оператор остатка (%) имеют более высокий приоритет, чем оператор сложения (+). В результате они оба вычисляются раньше, чем вычисляется оператор сложения.

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

2 + ((3 % 4) * 5)

(3 % 4) равно 3, значит можно записать:

2 + (3 * 5)

(3 * 5) равно 15, и значит мы можем записать:

2 + 15

Таким образом наш конечный результат равен 17.

Заметка

Правила приоритета и ассоциативности операторов Swift проще и более предсказуемые чем в C или Objective-C. Однако это означает, что они ведут себя не так же как они вели себя в этих C-языках. Будьте внимательны с тем, как ведут себя операторы взаимодействия при переносе кода в Swift.

 

Swift: 
4.0