Неопределенное поведение или: есть ли у Swift точки последовательности?
В C/C++ второе утверждение в
int i = 0;
int j = i++ + i++ + ++i;
вызывает оба
- неуказанное поведение, потому что порядок вычисления операндов не определен, и
- неопределенное поведение, потому что побочные эффекты на тот же объект
i
не секвенированы относительно друг друга.
Смотри например
- Почему эти конструкции (использующие ++) неопределенного поведения?
- Неопределенные точки поведения и последовательности
Теперь, учитывая, что Swift был задуман как безопасный язык, какова здесь соответствующая ситуация? Является ли результат
var i = 0
let j = i++ + i++ + ++i
хорошо определены? Можно ли из языковой ссылки в книге Свифта сделать вывод, что j == 4
?
1 ответ
На вопрос ответили разработчик Apple и дизайнер Swift Крис Латтнер на форуме разработчиков Apple https://forums.developer.apple.com/thread/20001:
Да, результатом этого выражения всегда будет 4. Swift вычисляет выражения слева направо, оно не является неопределенным или поведение, определяемое реализацией, как C.
Крис также добавил:
Тем не менее, если вы напишите такой код, кто-то, пытающийся поддерживать его, вероятно, будет не очень доволен вами
Согласовано! Это был экстремальный пример для демонстрации проблемы.