단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.
b = 3 + a++ 의 연산식을 설명하실 때, ++ 연산에 있어서 전위식과 후위식 표기 설명 중에 질문이 있습니다.일단 전위식의 경우에는 push 할 때 ++ 연산이 실행되고, 후위식의 경우에는 pop 할때 연산이 실행된다고 강의 중에 설명하셨습니다. 예를 들어 a 의 값이 2라고 가정하고 후위식으로 진행하는 과정에 대해서 생각해보았습니다. 그렇다면 push하는 과정에서는 2값이 들어갈테고 pop 하는 과정에서 a 값이 3으로 증가하긴 할텐데, 해당 내용을 토대로 결과를 확인하면 b의 값은 5가 출력됩니다.그 말은 pop을 할 때 ++ 연산이 진행됐지만 연산은 2로 진행됐다는 뜻인거고 그 이후에 ++ 연산이 일어나고 3으로 진행된 것으로 사료됩니다.일단 대충 이해는 하려면 할 수는 있겠으나 디스어셈블 창을 보면서 순서상으로 어느 부분에서 ++ 연산이 이뤄졌는지 이해가 되지 않아 질문드립니다.
답변 2
0
강의 중 설명은 스택을 이용한 스택 머신의 경우 그런 논리로 이해할 수 있다는 것입니다. 그러나 꼭 그렇게 해야 하는 것은 아닙니다. CPU의 특성에 따라 얼마든지 달라질 수 있습니다. 무엇보다 범용CPU 기계어로 번역될 때는 결과가 바르고 최적화와 관련한 문제가 없다면 결국 맞는 것입니다.
스택을 이용한 설명은 여러 방식 중 하나로 이해하시면 되겠습니다. 그리고 a값이 1 증가하는 시점은 mov dword ptr [a], eax 명령이 실행되는 지점 입니다. 그런데 그 전에 eax의 값을 증가시킨 직접적인 연산은 inc eax 명령입니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
b = 3 + a++; 연산에서 후위증감 연산자 ++는 식의 평가가 완료된 후에 변수 a의 값을 증가시킵니다. 따라서 이 연산이 진행되는 과정을 세부적으로 살펴보면 다음과 같습니다.
a의 현재 값(예제에서는 2)을 평가하여 이 값을 식에 사용합니다.
3과a의 현재 값을 더합니다. 즉, 3 + 2 = 5가 됩니다.
- 연산의 결과(5)를 변수
b에 할당합니다.
- 식의 평가가 완료된 후,
a의 값이 1 증가하여a는 3이 됩니다.
어셈블리어 코드를 통해 이 과정을 더 명확히 이해할 수 있습니다. 코드는 다음 단계로 구성됩니다.
mov eax, dword ptr [a]:a의 값을eax레지스터로 이동합니다.
add eax, 3:eax에 저장된 값에3을 더합니다.
mov dword ptr [b], eax:eax의 값을b에 저장합니다.
mov eax, dword ptr [a]: 다시a의 값을eax로 이동합니다.
inc eax:eax에 저장된 값(즉,a의 값)을 1 증가시킵니다.
mov dword ptr [a], eax:eax의 증가된 값을 다시a에 저장합니다.
이 코드는 b = 3 + a++; 연산을 어셈블리어로 표현한 것으로, 해당 연산이 어떻게 실행되는지 세부적으로 보여줍니다. 결론적으로, b의 최종 결과는 5가 되고, a는 연산 후 3이 됩니다.
![The image contains a block of assembly language code alongside a line of C code that seems to give context to what the assembly is accomplishing. Here’s a breakdown of the contents:The C code snippet:
b = 3 + a++;
This line suggests that ‘b’ is being assigned the value of 3 plus the current value of ‘a’, and then ‘a’ is incremented after its current value is used in the expression (due to the post-increment operator ++).The assembly code appears to correspond to the execution of the above C code line in a step-by-step manner, as a compiler might translate it for a machine to execute:1. mov eax, dword ptr [a]: This line moves the value of variable ‘a’ into the eax register.
2. add eax, 3: This adds 3 to the value currently in eax.
3. mov dword ptr [b], eax: This moves the result from eax into variable ‘b’, thereby setting ‘b’ to the value of ‘a’ + 3.
4. mov eax, dword ptr [a]: This moves the value of ‘a’ into eax again.
5. inc eax: This increments the value in eax.
6. mov dword ptr [a], eax: This moves the incremented value back into ‘a’.The final line in the C code (printf("a: %d, b: %d", a, b);) is a standard print statement in C, which prints the values of ‘a’ and ‘b’ as decimal integers.It’s important to note that the corresponding assembly code for the entire C code snippet including the printf function call would be more extensive than what is shown in the image. The assembly code provided is likely only demonstrating the assignment and increment operations before the printf function call.](https://cdn.inflearn.com/public/files/posts/96c8a87c-48ed-4d28-8150-f0993f893e20/aa.png)
병행성 제어
0
41
2
질문이 있습니다(강의와 거의 상관이 없는)
0
70
2
컴파일러 서적 질문입니다
0
154
1
코드생성 및 최적화 질문입니다
0
151
1
Hex Editor를 이용한 다국어 번역 관련 질문입니다
0
206
2
큐의 배열을 넘겨도 정상작동합니다
0
155
2
캐너리비트에 관하여 질문
0
207
3
상수화된 문자열에 질문있습니다
0
167
1
함수 호출 매개변수 전달에 대한 질문 드립니다.
0
187
1
함수호출 규약 종류에 따른 장단점 여부
0
221
2
정적라이브러리 링크 오류
0
221
1
const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의
0
348
2
pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.
0
248
2
비선형 자료구조
0
307
1
자료 구조 공부 후에
0
348
1
강의자료 관련
0
248
1
마지막에 말씀하신 부분 질문드립니다.
0
209
1
문자열 관련 질문 드립니다
0
286
1
라이브러리
0
269
1
부동소수점
0
386
1
왜 변수 주소 사이에 offset이 있는 건가요?
0
297
2
stack 쌓는 순서
0
500
1
함수호출이랑 쓰레드
0
404
1
리눅스 환경도 스레드 생성 원리는 동일한건가요?
0
522
1





