В первом примере:
i
получит значения 0, 1, 2, ..., M-1
j
получит значения 0, 1, 2, ..., N-1
Итак, sum
рассчитывается как
sum = a[0][0] + a[0][1] + a[0][2] + ... + a[0][N-1] +
a[1][0] + a[1][1] + a[1][2] + ... + a[1][N-1] +
a[2][0] + a[2][1] + a[2][2] + ... + a[2][N-1] +
...
...
a[M-1][0] + a[M-1][1] + a[M-1][2] + ... + a[M-1][N-1]
Во втором примере это было переключено так, что
i
получит значения 0, 1, 2, ..., N-1
j
получит значения 0, 1, 2, ..., M-1
так что теперь
sum = a[0][0] + a[0][1] + a[0][2] + ... + a[0][M-1] +
a[1][0] + a[1][1] + a[1][2] + ... + a[1][M-1] +
a[2][0] + a[2][1] + a[2][2] + ... + a[2][M-1] +
...
...
a[N-1][0] + a[N-1][1] + a[N-1][2] + ... + a[N-1][M-1]
Обратите внимание, что вторая версия неверна , поскольку аргумент int a[M][N]
, то есть первый допустимый индекс 0..M-1
, а второй допустимый индекс 0..N-1
В другихслова, если N и M отличаются во второй версии, обращаются к массиву без границ.
Чтобы сделать второй пример корректным.Эта строка sum+=a[i][j];
должна быть sum+=a[j][i];
, так что sum
теперь:
sum = a[0][0] + a[1][0] + a[2][0] + ... + a[M-1][0] +
a[0][1] + a[1][1] + a[2][1] + ... + a[M-1][1] +
a[0][2] + a[1][2] + a[2][2] + ... + a[M-1][2] +
...
...
a[0][N-1] + a[1][N-1] + a[2][N-1] + ... + a[M-1][N-1]
С этим изменением две версии функционально идентичны, то есть дают одинаковый результат.Они отличаются только в порядке добавления элементов.
Из-за структуры памяти двумерных массивов и работы системы кэширования первая версия может работать лучше, чем вторая.С другой стороны, компилятор может оптимизировать две версии для одинаковой работы.