Неопределенное поведение или: есть ли у 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.

Крис также добавил:

Тем не менее, если вы напишите такой код, кто-то, пытающийся поддерживать его, вероятно, будет не очень доволен вами

Согласовано! Это был экстремальный пример для демонстрации проблемы.

Другие вопросы по тегам