배열에서 사전 증분 대 사후 증분
저는 프로그래밍을 배우고 있고 C언어부터 시작했습니다.Let's 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.
제가 이해하는 데 잘못된 점이 있습니까?
당신은 정곡을 찌르고 말았습니다.당신의 이해가 맞습니다.사전 및 사후 증분식의 차이는 소리와 같습니다.사전 증분은 식을 설정하거나 평가하기 전에 변수가 증가함을 의미합니다.사후 증분이란 식이 설정되거나 평가된 다음 변수가 변경되는 것을 의미합니다.두 단계 과정이라고 생각하기 쉽습니다.
b = x++;
는 정말로:
b = x;
x++;
그리고.
b = ++x;
는 정말로:
x++;
b = x;
편집: 제공하신 예제 중 까다로운 부분은 어레이 인덱스와 해당 값 사이에 큰 차이가 있다는 것입니다.
i = ++a[1];
즉, a[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(remember 배열은 색인화되지 않음)을 알고 있습니다.하지만 우리는 그것을 먼저 늘립니다.따라서 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.
당신의 이해는 정확하지 않습니다.사전 증가 연산자와 사후 증가 연산자는 단항 연산자입니다.
따라서 처음에 b = 5이면 ++b 또는 b++는 b의 값을 6으로 증가시킵니다.그러나 사전과 사후의 차이는 할당 연산자 "="를 사용할 때 나타납니다.
그렇게,
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단계: inta[5] = {5, 1, 15, 20, 25}; 변수 배열은 크기가 5인 정수 배열로 선언되고 a[0] = 5, a[1] = 1, a[2] = 15, a[3] = 20, a[4] = 25로 초기화됩니다.
2단계: inti, 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 입니다.
언급URL : https://stackoverflow.com/questions/16869020/pre-increment-vs-post-increment-in-array
'programing' 카테고리의 다른 글
ASP.NET 코어, 권한 없는 경우 기본 리디렉션 변경 (0) | 2023.10.27 |
---|---|
git gui'를 실행할 때 "Loose Object" 팝업을 건너뛰는 방법 (0) | 2023.10.27 |
첫째 아이로 요소를 삽입하는 방법은? (0) | 2023.10.27 |
PowerShell에서 "배치 작업 종료(Y/N)" 확인을 억제하려면 어떻게 해야 합니까? (0) | 2023.10.27 |
Python+를 사용하여 MySQL 데이터베이스를 연결하는 방법원격으로 SQL Lchemy? (0) | 2023.10.27 |