Pre increment vs Post increment в массиве
Я изучаю программирование,и я начал с языка C. Я читал Let us c book. И я проходил через эту программу в той книге.
main( )
{
int a[5] = { 5, 1, 15, 20, 25 } ;
int i, j, k = 1, m ;
i = ++a[1] ;
j = a[1]++ ;
m = a[i++] ;
printf ( "n%d %d %d", i, j, m ) ;
}
мое понимание было, оно напечатает i as 2
, j as 1
и m as 15
но каким-то образом он печатается как i as 3
, j as 2
и m as 15
? Почему это так?
ниже мое понимание -
b = x++;
In this example suppose the value of variable ‘x’ is 5 then value of variable ‘b’ will be 5 because old value of ‘x’ is used.
b = ++y;
In this example suppose the value of variable ‘y’ is 5 then value of variable ‘b’ will be 6 because the value of ‘y’ gets modified before using it in a expression.
есть ли что-то неправильное в моем понимании?
3 ответов
вы попали в ноготь на голове. Ваше понимание правильно. Разница между выражениями до и после инкремента так же, как это звучит. Pre-incrementation означает, что переменная увеличивается до того, как выражение будет установлено или оценено. Пост-приращение означает выражение или оценку, а затем переменной изменяется. Легко думать об этом как о двухэтапном процессе.
b = x++;
действительно:
b = x;
x++;
и
b = ++x;
действительно:
x++;
b = x;
EDIT: хитрая часть примеров, которые вы предоставили (что, вероятно, сбило вас с толку), заключается в том, что существует огромная разница между индексом массива и его значением.
i = ++a[1];
это означает увеличение значения, хранящегося в[1], а затем установите его в переменную i.
m = a[i++];
это означает, что установите m в значение A[i], затем увеличьте i. Разница между этими двумя является довольно большим различием и может сначала сбивай с толку.
второе редактирование: разбивка кода
{
int a[5] = { 5, 1, 15, 20, 25 } ;
int i, j, k = 1, m ;
i = ++a[1] ;
j = a[1]++ ;
m = a[i++] ;
printf ( "\n%d %d %d", i, j, m ) ;
}
первый:
i = ++a[1];
на данный момент мы знаем a[1] = 1 (Помните, что массивы индексируются нулем). Но Сначала мы увеличиваем его. Поэтому i = 2.
j = a[1]++;
помните, что мы увеличили a[1] раньше, поэтому в настоящее время это 2. Мы установили j = 2, а затем увеличили его до 3. Итак, j = 2, а теперь a[1] = 3.
m = a[i++];
мы знаем i = 2. Поэтому нам нужно установить m = a[2], и затем увеличьте i. В конце этого выражения m = 15 и i = 3.
в целом,
i = 3, j = 2, m = 15.
ваше понимание не совсем верно. Операторы Pre-increment и post-increment являются унарными операторами.
Итак, первоначально, если b = 5, то ++b или B++ увеличивает значение b до 6. Однако разница между pre и post возникает, когда вы используете оператор присваивания "=".
и
if b=5
a=b++ // after this statement a=5 and b=6 as it is post increment
c=++b // after this statement c=7 and b=7
для ясного понимания вы можете разделить приведенные выше утверждения следующим образом:
a=b;
b=b+1; //post increment
b=b+1; //pre increment
c=b;`
Итак, пример вы дал:
main( )
{
int a[5] = { 5, 1, 15, 20, 25 } ;
int i, j, k = 1, m ;
i = ++a[1] ; // a[1] = 2 and i = 2
j = a[1]++ ; // j = 2 and a[1] = 3
m = a[i++] ; // m = a[2++] = 15, i now becomes 3
printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15
}
для ясности я разделяю приведенный выше код на несколько операторов:
main( )
{
int a[5] = { 5, 1, 15, 20, 25 } ;
int i, j, k = 1, m ;
a[1] = a[1] + 1;
i = a[1];
j = a[1];
a[1] = a[1] + 1;
m = a[i]; // m = a[2] = 15
i = i + 1;
printf ( "\n%d %d %d", i, j, m ) ; // so i =3, j= 2 and m =15
}
Я надеюсь, что приведенное выше объяснение очищает ваши сомнения и выход из программы выполняется.
объяснение:
Шаг 1: int a[5] = {5, 1, 15, 20, 25}; переменная arr объявляется как целочисленный массив размером 5 и инициализируется как a[0] = 5, A[1] = 1, a[2] = 15, a[3] = 20, A[4] = 25 .
Шаг 2: int i, j,m; переменная i,j, m объявляется как целочисленный тип.
Шаг 3: i = ++a[1]; становится i = ++1; следовательно, i = 2 и A[1] = 2
Шаг 4: j = a[1]++; становится j = 2++; следовательно, j = 2 и a[1] = 3.
Шаг 5: m = a[I++]; становится m = a[2]; следовательно, m = 15 и I увеличивается на 1(i++ означает 2++, поэтому i=3)
Шаг 6: printf ("%d, %d, %d", i, j, m); он печатает значение переменных i, j, M
следовательно, выход программы равен 3, 2, 15