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.
В моем понимании что-то не так?
Ответы
Ответ 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