Диаграмма приоритета имеет вертикальный компонент (приоритет) и горизонтальный компонент (ассоциативность).
Обычно операции, выполняемые выше в списке, выполняются первыми, поэтому 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;
}
Я бы посоветовал вам быстро разобраться в этом, затем напечатать его для компиляции и запуска.