Почему обмен имени переменной меняет вывод программы на C? - PullRequest
0 голосов
/ 15 марта 2019

Я попробовал этот пример массива и постинкрементного / предварительного инкремента для его элементов

#include<stdio.h>

int main()
{
    int j[5] = {5, 1, 15, 20, 25};
    int k , l, m, n;

    n = ++j[1];
    k = ++j[1];
    l = j[1]++;
    m = j[k++];

    printf("\n%d, %d, %d, %d", n, k, l, m );

    return 0;
}

здесь вывод:

2, 4, 3, 20

, и если я меняю порядок n иk т.е. вместо

n = ++j[1];
k = ++j[1];

я пишу

k = ++j[1];
n = ++j[1];

Вывод будет:

3, 3, 3, 15

Я пробовал это на компиляторе mingw на windows10, а также на Kali LinuxGCC ... Та же проблема.

Это похоже на то, как если взять другое имя переменной, это повлияет на вывод программы.В чем может быть причина?

Спасибо всем за помощь в решении этого вопроса.

Я не учел приращение k последнего поста.

Результаты будутто же самое я бы изменил

m=j[k++]

с

m = j[n++]

Ответы [ 3 ]

2 голосов
/ 15 марта 2019

Почему бы не они? Значения k, n и m зависят от их размещения в коде.

Например,

 m = j[k++];

на это будет влиять значение current k.

Чтобы добавить немного об операторе до и после, заключите в кавычки C11,

  • Глава §6.5.3.1, предварительное увеличение

    Значение операнда префикса оператора ++ увеличивается на единицу. Результатом является новый значение операнда после приращения. [...]

  • Глава §6.5.2.4, постинкремент

    Результатом оператора постфикса ++ является значение операнда. Как побочный эффект, значение объекта-операнда увеличивается (то есть значение 1 соответствующего типа добавил к этому). [....]

Я добавил несколько операторов печати, чтобы проверить, как значения влияют после каждого оператора. Вы можете дополнительно распечатать весь массив, чтобы визуализировать изменения еще больше.

int j[5] = {5, 1, 15, 20, 25};
int k , l, m, n;

printf("j[1] = %d\n", j[1]);

k = ++j[1];
printf("j[1] = %d, k = %d\n", j[1], k);
n = ++j[1];
printf("j[1] = %d, n = %d\n", j[1], n);
l = j[1]++;
printf("j[1] = %d, l = %d\n", j[1], l);
m = j[k++];
printf("m= %d, k = %d\n", m, k);

printf("\n%d, %d, %d, %d", n, k, l, m );

и вывод:

j[1] = 1
j[1] = 2, k = 2
j[1] = 3, n = 3
j[1] = 4, l = 3
m= 15, k = 3

3, 3, 3, 15
1 голос
/ 15 марта 2019

В первом случае:

n = ++j[1]; //j[1] is incremented and is now 2, so n is 2
k = ++j[1]; //j[1] is incremented again and is now 3, so k is 3
l = j[1]++; //j[1] is incremented yet again and is now 4, but l is 3 as it is post-increment
m = j[k++]; //m  is j[3] which is 20, and k will become 4 as it is post-incremented

Таким образом, вывод n, k, l, m будет 2, 4, 3, 20

Во втором случае:

k = ++j[1]; //j[1] is incremented and is now 2, so k is 2
n = ++j[1]; //j[1] is incremented again and is now 3, so n is 3
l = j[1]++; //j[1] is incremented again and is now 3, but l is 3
m = j[k++]; //m  is j[2] which is 15, and k will become 3 as it is post-incremented

Итак, выводиз n, k, l, m будет 3, 3, 3, 15

0 голосов
/ 15 марта 2019

На самом деле, это не так сложно int j [5] = {5, 1, 15, 20, 25};

n = ++j[1];
// n=2 j[1]=2

k = ++j[1];
// k=3 j[1]=3

l = j[1]++;
// l=3 j[1]=4

m = j[k++];
// since k=3, k becomes 4 but m is assigned j[3] which is 20

Давайте посмотрим на другой случай

int j[5] = {5, 1, 15, 20, 25};

k = ++j[1];
// k=2 j[1]=2

n = ++j[1];
// n=3 j[1]=3

l = j[1]++;
// l=3 j[1]=4

m = j[k++];
// since k=2, k becomes 3 but m is assigned j[2] which is 15
...