Первое, что делает цикл for
, это указывает pi
на tab
, т.е. pi=&tab[0]
Таким образом, pi
указывает на число 2. Следующий фрагмент кода, который должен быть выполнен, - это оператор условия «100» * цикла for
++pi < tab+9
. Это первое увеличение pi
(теперь оно указывает на число 4 в tab[1]
) и проверяет, указывает ли оно на элемент tab
раньше, чем окончательное значение 20.
В теле цикла for
строка *pi++ = 0;
сначала сохраняет 0 по адресу, на который указывает pi
(что означает, что tab[1]
теперь 0, а не 4), а затем (после ) увеличивает pi
до tab[2]
, что равно 6. Затем строка *pi *= 2;
удваивает значение, на которое указывает pi
, поэтому tab[2]
становится 12.
Следующее, что происходит, это переоценка условного оператора цикла for
(поскольку его оператор итерации пуст): pi
увеличивается и проверяется.
Остальные итерации довольно просты. Конечное состояние tab
состоит в том, что первый член остается неизменным, члены с нечетным индексом равны нулю, а другие члены удваиваются от своего начального значения.
Общие рекомендации относительно операторов и приоритета: одна из двух ситуаций почти всегда имеет место. Во-первых, вы и компилятор не согласны с порядком, в котором будут применяться операторы в вашем коде - другими словами, ваш код не выполняет то, что вы ожидаете. Во-вторых, вы прекрасно понимаете, что собирается делать компилятор, но программист, читающий ваш код, этого не делает - другими словами, ваш код не делает то, что они ожидают. К счастью, обе ситуации можно смягчить, добавив скобки, чтобы устранить любые сомнения.