Порядок оценки по оператору индекса: undefined .Давайте приведем еще один пример, который не так запутан.
Проблема: рассмотрим следующее выражение:
f() + g() * h()
Приоритет совершенно ясен;умножение выигрывает у сложения, как показывает соответствующее дерево разбора:
+
/ \
/ \
f() *
/ \
/ \
g() h()
таблица приоритетов говорит нам только о том, как сгруппированы термины, а не порядок их оценки.Единственный способ сделать порядок предсказуемым - это ввести то, что Стандарт C называет точками последовательности .Например, шаги:
x = g();
x = x * h();
x = x + f();
имеют тот же приоритет, что и раньше, но с функциями, вызываемыми в гарантированном порядке g()
, h()
и f()
.
Итак, в вашем примере вы должны ввести точки последовательности, чтобы гарантировать, что ваши операторы printf
выполняются в нужном порядке.