Является ли `y = x = x + 1;` неопределенным поведением? - PullRequest
18 голосов
/ 06 февраля 2011

Этот код:

y = x = x + 1;

неопределенное поведение в C?

Ответы [ 3 ]

32 голосов
/ 06 февраля 2011

Ответ на ваш вопрос
Нет.

Что будет
Это произойдет:

int x = 1; /* ASSUME THIS IS SO */
y = x = x + 1;

/* Results: */
y == 2;
x == 2;

Как это компилируется
Так же, как:

x += 1;
y = x;

Почему это не определено
Потому что вы не пишете x в том же выражении, которое вы читаете. Вы просто устанавливаете его на + 1, затем присваиваете y значение x.

Ваше будущее
Если вы считаете, что код запутан, вы можете использовать круглые скобки для удобства чтения:

y = x = (x + 1);
17 голосов
/ 06 февраля 2011

Нет, ваше выражение правильно определено.Вы, наверное, искали y = x = x++;, которого нет.

9 голосов
/ 06 февраля 2011

Нет.Вы изменяете x только один раз, и из-за ассоциативности справа = это назначение происходит перед присвоением y.Даже если это произошло после этого, есть только одна модификация x.Ваше заявление так же законно, как и y = ++x.

...