Kohila G Ответов: 2

Странный результат при предварительном инкременте и постинкременте внутри массива в C++


Я искал на этом сайте подобный вопрос, но ни один из них не касался этого подробно. Мне очень жаль, если это самый часто используемый вопрос на этом сайте. Но этот фрагмент кода очень озадачивает.

#include<bits/stdc++.h>
using namespace std;
int main(){
int a[3];
cout<<"Enter number to be inserted: "<<endl;
int num;//Value that is intended to be inserted in a[0].
int index;//To keep track of array index.
cin>>num;

cout<<"Postincrement"<<endl;
index=-1;
a[index++]=num;
cout<<a[index]<<endl;
cout<<index<<endl;

cout<<"Preincrement"<<endl;
index=-1;
a[++index]=num;
cout<<a[index]<<endl;
cout<<index<<endl;
}


Что я уже пробовал:

3
Postincrement
-606760192
3
Preincrement
3
0

Преинкремент работает отлично. Элемент вставляется в a[0], а индекс равен 0.

Я не понимаю, почему значение индекса становится числом(в данном случае 3) при последующем приращении. Не должен кол-во быть вставлен в массив ([0]).Как можно было бы присвоить номер индексу, если было четко указано, что a[index++]=num. Может ли кто-нибудь помочь мне лучше понять это?

2 Ответов

Рейтинг:
18

Greg Utas

В

a[index++]=num;
a сначала индексируется по index, эта ячейка настроена на num и , наконец, index увеличивается в размерах.

В
a[++index]=num;
index сначала увеличивается и затем используется в качестве индекса для ячейки, которая имеет значение num.

Это означает, что ваше первое задание на самом деле
a[-1]=num;
после чего a[0] все еще содержит случайный мусор: -606760192 в этом случае. И не только это, но и назначение на a[-1] обычно это приводит к повреждению памяти или немедленному сбою вашей программы в отладочной сборке, включающей проверку границ массива.


Espen Harlinn

или он может продолжать выполняться в поврежденном состоянии, и это может быть еще хуже. :-)

Greg Utas

Определенно хуже. Бродяга-это страшная ошибка, потому что проблема редко проявляется до тех пор, пока преступник не покинет место преступления. :)

CPallini

5.

Kohila G

Спасибо за разъяснение.

Рейтинг:
10

OriginalGriff

Чтобы добавить к тому, что говорит Грег, вы начинаете с индекса -1, что означает, что ваше первое назначение помещается вне массива. Так как index и a создаются в стеке, память, к которой вы обращаетесь, вероятно, является частью обратного адреса для main функция. Это приведет к тому, что ваше приложение будет делать странные вещи в лучшие времена или будет обнаружено с помощью связанного кода проверки.

Вы можете посмотреть здесь: Почему x = ++x + x++ дает мне неправильный ответ?[^] - он пытается объяснить пре - и пост-инкремент и может помочь вам увидеть, что происходит.


Kohila G

Спасибо за разъяснение.