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