почему “f = f ++” небезопасно в c?

var baseUri = new Uri("http://my.server.com/folder/directory/sample");
var absoluteUri = new Uri(baseUri,"../../other/path");

ИЛИ

Uri uri;
if ( Uri.TryCreate("http://base/","../relative", out uri) ) doSomething(uri);
9
задан Ólafur Waage 7 November 2009 в 00:54
поделиться

5 ответов

Проблема в Точки последовательности . В этом статусе есть две операции без точки последовательности, поэтому нет определенного порядка для оператора, выполняется ли сначала присваивание или приращение?

Ничто не говорит о том, что это небезопасно, это просто не определено,

16
ответ дан 4 December 2019 в 08:33
поделиться

Использование x и x ++ (или ++ x ) в одном операторе приводит к неопределенному поведению в C. Компилятор может делать все, что хочет: либо увеличивать x до выполнения присваивания, либо после этого. Взяв код Олафура, он может дать f == 5 или f == 6 , в зависимости от вашего компилятора.

4
ответ дан 4 December 2019 в 08:33
поделиться

Статья по ссылке (очищено) , которую вы предоставили, дает ответ. «C почти не обещает, что побочные эффекты будут возникать в предсказуемом порядке в пределах одного выражения». Это означает, что вы не знаете, в каком порядке будут появляться символы = и ++. Это зависит от компилятора.

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

4
ответ дан 4 December 2019 в 08:33
поделиться

Из стандарта

6.5 (2) Если побочный эффект на скалярный объект не упорядочен относительно другого побочного эффекта на том же скалярном объекте или вычисления значения с использованием значение того же скаляра объект, поведение не определено. Если существует несколько допустимых порядков подвыражения выражения, поведение не определено, если такая неупорядоченная сторона эффект возникает в любом из порядков. 74)

74) Этот абзац отображает неопределенные выражения операторов, такие как

             i = ++i + 1;
             a[i++] = i;

, при этом разрешая

             i = i + 1;
             a[i] = i;
1
ответ дан 4 December 2019 в 08:33
поделиться

Я поддерживаю ответ Артура в этом отношении. Хотя реализация оператора пост-инкремента, т.е. f ++, сбивает с толку, она не считается небезопасной. Вы должны сначала понять, как компилятор интерпретирует это. будет ли он увеличивать f после того, как встретит завершение предложения (;), или сразу после использования значения f.

0
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: