Что будет результатом выполнения кода? Приоритет оператора C - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с предсказанием результата кода, указанного ниже. Почему программа печатает 2 0 6 0 10 0 16 0 20 0? Я думаю, это все о приоритете операторов, но, подумав некоторое время, я не могу понять, что не так с моей интерпретацией. Можете ли вы объяснить это немного?

#include <stdio.h>

int main(void)
{
    int tab[10] = {2,4,6,8,10,14,16,18,20};
    int *pi, i;
    for(pi = tab; ++pi < tab+9;)
    {
        *pi++ = 0;
        *pi *= 2;
    }

    for(int i=0; i<10; i++)
        printf("%d ", tab[i]);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Первое, что делает цикл 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 состоит в том, что первый член остается неизменным, члены с нечетным индексом равны нулю, а другие члены удваиваются от своего начального значения.

Общие рекомендации относительно операторов и приоритета: одна из двух ситуаций почти всегда имеет место. Во-первых, вы и компилятор не согласны с порядком, в котором будут применяться операторы в вашем коде - другими словами, ваш код не выполняет то, что вы ожидаете. Во-вторых, вы прекрасно понимаете, что собирается делать компилятор, но программист, читающий ваш код, этого не делает - другими словами, ваш код не делает то, что они ожидают. К счастью, обе ситуации можно смягчить, добавив скобки, чтобы устранить любые сомнения.

0 голосов
/ 14 января 2019

Фактический результат равен 2 0 12 0 20 0 32 0 40 0 (как показано в комментарии Blastfurnace https://ideone.com/UUy8QO)

pi действительно изначально находится в первой ячейке, но ваше условие останова увеличивает указатель. Следовательно, внутри цикла, для первой инструкции, pi находится в tab[1]. Сначала эта ячейка устанавливается в 0, а затем увеличивается на ++. Во второй строке значение удваивается, поэтому оно удваивается tab[2]. Затем условие останова снова увеличивает указатель и т. Д.

...