Подтвердить что ты не робот

Pre increment vs Post increment в массиве

Я изучаю программирование, и я начал с языка C. Я читал "C". И я проходил эту программу в этой книге.

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.

В моем понимании что-то не так?

4b9b3361

Ответ 1

Вы ударяете ноготь по голове. Ваше понимание верное. Разница между выражениями pre и post increment одинакова. Предварительная инкрементация означает, что переменная увеличивается до того, как выражение будет установлено или оценено. Пост-инкремент означает, что выражение установлено или оценено, а затем переменная изменена. Легко думать об этом как о двухэтапном процессе.

b = x++;

действительно:

b = x;
x++;

и

b = ++x;

действительно:

x++;
b = x;

EDIT: сложная часть представленных вами примеров (что, вероятно, отбросило вас), заключается в том, что существует огромная разница между индексом массива и его значением.

i = ++a[1];

Это означает увеличение значения, хранящегося в [1], и затем установите его в переменную i.

m = a[i++];

Это означает, что m задает значение a [i], а затем увеличивает i. Разница между ними - довольно большое различие и может сначала ввести в заблуждение.

Второй EDIT: разбивка кода

{ 
 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 (помните, что массивы нулевые индексируются). Но мы увеличиваем его в первую очередь. Поэтому я = 2.

j = a[1]++;

Помните, что мы увеличили значение [1] до этого, так что оно в настоящее время равно 2. Положим j = 2, и THEN увеличил его до 3. Итак, j = 2 и теперь a [1] = 3.

m = a[i++];

Мы знаем я = 2. Поэтому нам нужно установить m = a [2], а затем увеличить i. В конце этого выражения m = 15 и я = 3.

Таким образом,

i = 3, j = 2, m = 15.

Ответ 2

Ваше понимание не совсем правильно. Операторы предварительного инкремента и пост-инкремента являются унарными операторами.

Итак, изначально, если 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  
}

Надеюсь, что приведенное выше объяснение избавит вас от сомнений и результатов работы вашей программы.

Ответ 3

Объяснение:

Шаг 1: int a [5] = {5, 1, 15, 20, 25}; Переменная arr объявляется как целочисленный массив размером 5 и инициализируется значением [0] = 5, a [1] = 1, a [2] = 15, a [3] = 20, a [4 ] = 25.

Шаг 2: int i, j, m; Переменная i, j, m объявляется как целочисленный тип.

Шаг 3: я = ++ a [1]; становится я = ++ 1; Следовательно, я = 2 и a [1] = 2

Шаг 4: j = a [1] ++; становится j = 2 ++; Следовательно, j = 2 и a [1] = 3.

Шаг 5: m = a [i ++]; становится m = a [2]; Следовательно, m = 15 и я увеличивается на 1 (i ++ означает 2 ++, так что я = 3)

Шаг 6: printf ( "% d,% d,% d", i, j, m); Он печатает значение переменных i, j, m

Следовательно, выход программы равен 3, 2, 15