Инкрементные массивы в C, SPECIAL CASE - PullRequest
1 голос
/ 14 апреля 2011

меня смущает следующий код:

#include <stdio.h>

int main()
{
    int a[] = {5, 15, 1, 20, 25};
    int i, j, m;

    i = ++a[1];   /*statement 1*/
    j = a[1]++;   /*statement 2*/
    m = a[i++];   /*statement 3*/

    printf("\n%d\n%d\n%d\n", i, j, m);

    return 0;
}

Утверждения 1, 2, 3 меня немного смущают; Я не понимаю, как они производят продукцию для меня. Кто-нибудь может пролить свет на это, пожалуйста?

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011
i=++a[1];   /*statement 1*/   // increments the value of a[1] and assigns to i
j=a[1]++;   /*statement 2*/   // assign the value of a[i] and then increments the value of a[i] to j
m=a[i++];   /*statement 3*/   //  assign a[i] to m, and increment i


i=++a[1];   // a[1] is 15 here so i =16, and a[1] =16
j=a[1]++;   // a[1] is 16 so j =16 and a[1] =17
m=a[i++];   // i is 16 here but index 16 does not exists here, so program fails
2 голосов
/ 14 апреля 2011
i = ++a[1];   /*statement 1*/

Слушайте, что [1] будет 15. и оператор предварительного увеличения увеличит [1] с 1 S0 i will be 16

j = a[1]++;   /*statement 2*/

Оператор пост-инкремента также увеличивает значение [1] на 1., поэтому j will be 16.

m = a[i++];   /*statement 3*/

Здесь это i ++, так что послеоператорный инкремент увеличит i на 1. Раньше я вычислялся 16. сейчас i will now be 17.

So a[17] has no value. so m will be junk value
0 голосов
/ 14 апреля 2011

В случае сомнений вы можете использовать gdb:

  1. Скомпилируйте свой флаг отладки настройки кода (-g для gcc) gcc -g -o so stackoverflow.c
  2. запустите gdb gdb ./so
  3. идентифицирует строки для разрыва list в gdb
  4. устанавливает точки останова break 6 (первый разрыв - строка 6)
  5. Шаг вперед step
  6. Отображать значения print i или print a[1], например.

Но будьте осторожны, если вы вызываете print ++a[1] в GDB, вы можете изменить поведение вашей программы!

0 голосов
/ 14 апреля 2011

Первое выражение

i = ++a[1] ---> Увеличивает значение значения [1] (т. Е.) I на 16

Второе выражение

j = a[1]++ ---> Присвойте значение a [1] j, а затем увеличьте (т. Е.) J будет 16.

Третье утверждение

m = a[i++] -> Присвоение значенияот [i] до m и i увеличивается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...