При компиляции с помощью компилятора clang (версия - clang-1001.0.46.4), получая эти предупреждения:
p.c:6:19: warning: unsequenced modification and access to 'b' [-Wunsequenced]
int e = (a++ * ++b)-((c / b) * a) + d;
^ ~
p.c:6:14: warning: unsequenced modification and access to 'a' [-Wunsequenced]
int e = (a++ * ++b)-((c / b) * a) + d;
^ ~
Из стандартов C11 # 6.5p2 [выделение добавлено]
2 Если побочный эффект скалярного объекта не секвенирован относительно , либо другой побочный эффект для того же скалярного объекта, либо вычисление значения с использованием значения того же скалярного объекта поведение не определено . Если существует несколько допустимых упорядочений подвыражений выражения, поведение не определено, если такой непоследовательный побочный эффект возникает в любом из порядков.84)
Выражение вызывает неопределенное поведение.
Редактировать:
Вопрос, помеченный gcc
, поэтому для полноты ответа ниже приведен вывод при компиляции с gcc
компилятором с опцией -Wall
:
p.c:6:19: warning: operation on 'b' may be undefined [-Wsequence-point]
int e = (a++ * ++b)-((c / b) * a) + d;
^
p.c:6:14: warning: operation on 'a' may be undefined [-Wsequence-point]
int e = (a++ * ++b)-((c / b) * a) + d;
^
Обратите внимание, что, если мы не указываем какие-либо параметры (например, -Wall
или -Wsequence-point
) для gcc
во время компиляции, это не выдает никакого предупреждающего сообщения для рассматриваемого выражения, но это не в случае с clang
компилятором.