C ++ 17 (N4659
) включает предложение Refining Expression Evaluation Order для Idiomatic C ++ , которое определяет более строгий порядок оценки выражения.
В частности, [ было добавлено следующее предложение :
8.18 Операторы присваивания и составного присваивания: ....
Во всех случаях назначение упорядочивается после значения вычисление правого и левого операндов и перед вычислением значения выражения присваивания. Правильный операнд секвентирован перед левым операндом.
Он делает несколько случаев ранее не определенного поведения действительными, включая тот, о котором идет речь:
a[++i] = i;
Однако несколько других подобных случаев по-прежнему приводят к неопределенному поведению.
В
N4140
:i = i++ + 1; // the behavior is undefined
Но в
N4659
i = i++ + 1; // the value of i is incremented i = i++ + i; // the behavior is undefined
Конечно, использование компилятора, совместимого с C ++ 17, не обязательно означает, что следует начинать писать такие выражения.
Единственный способ, которым я знаю, сделать это в javascript, это использовать всплывающее окно подтверждения. Он имеет общие кнопки «ОК» и «Отмена», которые, я не думаю, можно редактировать, и отформатирован в соответствии с веб-браузером пользователя. Чтобы использовать метод подтверждения, вы пишете:
if (confirm("Do you really want to leave here?"){
//do whatever
}