Я прочитал о «побочном эффекте» на этом веб-сайте:
но до сих пор не понимаю, почему f = f++
считается небезопасным?
Кто-нибудь может объяснить?
Я прочитал о «побочном эффекте» на этом веб-сайте:
но до сих пор не понимаю, почему f = f++
считается небезопасным?
Кто-нибудь может объяснить?
Проблема заключается в точках последовательности. В этом статусе есть две операции без точки последовательности, поэтому нет определенного порядка для оператора, выполняется ли сначала присвоение или приращение?
Ничто не говорит о том, что это небезопасно, это просто undefined, что означает, что разные реализации могут иметь разные результаты или может отформатировать ваш жесткий диск ...
f = f++
. Хотя я думаю, что большинство людей говорят «небезопасно», не имея в виду, что это может что-то разрушить, но что вы не можете зависеть от того, что он сделает.
- person Michael Burr; 07.11.2009
Использование x
и x++
(или ++x
) в одном операторе - это неопределенное поведение в C. Компилятор может делать все, что захочет: либо увеличивать x
перед выполнением присваивания, либо после этого. Взяв код Олафура, он может дать f == 5
или f == 6
, в зависимости от вашего компилятора.
Статья по ссылке (очищено) предоставленный вами ответ. «C почти не обещает, что побочные эффекты будут возникать в предсказуемом порядке в пределах одного выражения». Это означает, что вы не знаете, в каком порядке будут появляться символы = и ++. Это зависит от компилятора.
Если вы перейдете по ссылке из этой статьи на статью о точки последовательности на том же сайте, вы увидите, что компилятор может оптимизировать, что и когда он записывает значения обратно из регистров в переменные.
f
) могут дать совершенно разные результаты.
- person Michael Burr; 07.11.2009
Из стандарта
6.5 (2) Если побочный эффект на скалярный объект не упорядочен относительно другого побочного эффекта на тот же скалярный объект или вычисления значения с использованием значения того же скалярного объекта, поведение не определено. Если существует несколько допустимых порядков подвыражений выражения, поведение не определено, если такой неупорядоченный побочный эффект возникает в любом из порядков. 74)
74) В этом абзаце представлены неопределенные выражения операторов, такие как
i = ++i + 1; a[i++] = i;
позволяя
i = i + 1; a[i] = i;
В этом отношении я поддерживаю ответ Артура. Хотя реализация оператора пост-инкремента, то есть f ++, сбивает с толку, она не считается небезопасной. Вы должны сначала понять, как компилятор интерпретирует это. будет ли он увеличивать f после того, как встретит завершение предложения (;) или сразу после использования значения f.