Порядок очередности операций / циклы - PullRequest
0 голосов
/ 21 апреля 2011

На языке программирования C:

  1. Это Я не понимаю.Это говорит о том, что (например), если + = после - = в выражении, + = вычисляется первым?Или, если * перед - -, - выполняется первым?Мне нужно понять приоритет.

  2. Может кто-нибудь написать мне два или три сложных цикла, которые включают в себя: несколько переменных счетчика, 3 или 4 или 5 циклов внутри каждого другого, массивы, printf и строки и прочее?Мне нужно научиться очень хорошо вручную проходить циклы на бумаге, если я хочу сдать экзамен по программированию или завтра сдать экзамен.

Это не домашнее задание, т. Е. Ничегосдать, просто готовлюсь к завтрашнему экзамену по Си.

Ответы [ 3 ]

4 голосов
/ 21 апреля 2011

Диаграмма приоритета имеет вертикальный компонент (приоритет) и горизонтальный компонент (ассоциативность).

Обычно операции, выполняемые выше в списке, выполняются первыми, поэтому a + b * c оценивается как a + (b * c). Обратите внимание, что это не означает, что b * c вычисляется до a, просто операция * выполняется до +. Реализация может вычислить сначала a, , затем , умножить b и c и добавить это к уже вычисленному a.

Для простых выражений это не имеет значения, но может укусить вас, если один из терминов вашего выражения имеет побочный эффект помимо предоставления простого значения. Под этим я подразумеваю такие вещи, как i++, побочный эффект которых заключается в увеличении i, или вызов функции, которая изменяет глобальные переменные или записывает информацию в базу данных.

Если два оператора имеют одинаковый приоритет , их объединяет ассоциативность. Это диктует, как операции с одинаковыми приоритетными группами вместе.

То есть + и - (которые имеют ассоциативность слева направо) означает, что a + b - c оценивается как (a + b) - c.

С другой стороны, += и -= имеют ассоциативность справа налево, так что a += b -= c оценивается как a += (b -= c).


С точки зрения циклов, вы можете начать со следующего:

#include <stdio.h>
#define WIDTH 5
#define HEIGHT 7
int main (void) {
    int num[WIDTH*HEIGHT];
    int counter = 100;
    for (int i = 0; i < HEIGHT; i++)
        for (int j = 0; j < WIDTH; j++)
            num[i*WIDTH+j] = --counter;
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            printf ("%3d ", num[i*WIDTH+j]);
        }
        printf ("\n");
    }
    return 0;
}

Я бы посоветовал вам быстро разобраться в этом, затем напечатать его для компиляции и запуска.

1 голос
/ 21 апреля 2011

Приоритет оператора и ассоциативность не определяют порядок , в котором C оценивает выражения.Он определяет, как подвыражения группируются вместе.

+= и -= имеют одинаковый приоритет и ассоциируются справа налево.Это означает, что в этом выражении:

a += b -= c

C группирует его как:

a += (b -= c)

Таким образом, значение, которое вычитается из b, равно c, а значение, которое являетсяк a добавляется результат выражения b -= c (которое является новым значением b).Порядок, в котором это происходит на самом деле, не указан.


Попробуйте этот вложенный цикл - что он делает?

int check(const char *entries[], size_t num_entries)
{
    int i, j;
    int count = 0;

    for (i = 1; i < num_entries; i++)
    {
        size_t ilen = strlen(entries[i]);

        for (j = 0; j < i; j++)
        {
            size_t jlen = strlen(entries[j]);

            if (jlen >= ilen && !memcmp(entries[i], entries[j], ilen))
            {
                count++;
                printf("%s@%d shadows %s@%d.\n", entries[j], j, entries[i], i);
            }
        }
    }

    return count;
}
1 голос
/ 21 апреля 2011

1) «Операторы в одной строке на диаграмме имеют одинаковый приоритет», поэтому a + b - c оценивается как (a + b) - c. Прочитайте эту страницу сверху вниз, чтобы получить порядок операций. Таким образом, для a + b + (c * ++d) порядок будет прибавлять 1 к d, умножить его на c, а затем добавить все это количество к количеству a + b.

2) Для циклов просто прочитайте, как обычную книгу, сверху вниз. Например: (псевдокод исправлен до правильного C -zw)

int i, j, k;
for (i = 0; i < 100; i++)
    for (j = 0; j < 10; j++)
        for (k = 10; k > 0; k = k/2)
            printf("%d %d %d\n", k, j, i);

Вы начинаете с i как 0, а j как 0, i и j остаются 0, в то время как k равно 10, 5, 2, 1, затем вы возвращаетесь и j становится 1, в то время как i остается 0, а k равно 10, 5 , 2, 1. Повторяйте до тех пор, пока j не станет 10, затем вернитесь назад и сделайте i 1. Повторяйте все это до тех пор, пока мне не станет 100. Внутренний цикл запускается до завершения для каждого значения исходящего цикла.

...