programing

배열에서 사전 증분 대 사후 증분

telecom 2023. 10. 27. 21:44
반응형

배열에서 사전 증분 대 사후 증분

저는 프로그래밍을 배우고 있고 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

반응형