인프런 커뮤니티 질문&답변

clang님의 프로필 이미지
clang

작성한 질문수

독하게 되새기는 C 프로그래밍

단항 증/감 연산에 대한 다른 접근

단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.

해결된 질문

작성

·

75

0

 b = 3 + a++ 의 연산식을 설명하실 때, ++ 연산에 있어서 전위식과 후위식 표기 설명 중에 질문이 있습니다.일단 전위식의 경우에는 push 할 때 ++ 연산이 실행되고, 후위식의 경우에는 pop 할때 연산이 실행된다고 강의 중에 설명하셨습니다. 예를 들어 a 의 값이 2라고 가정하고 후위식으로 진행하는 과정에 대해서 생각해보았습니다. 그렇다면 push하는 과정에서는 2값이 들어갈테고 pop 하는 과정에서 a 값이 3으로 증가하긴 할텐데, 해당 내용을 토대로 결과를 확인하면 b의 값은 5가 출력됩니다.그 말은 pop을 할 때 ++ 연산이 진행됐지만 연산은 2로 진행됐다는 뜻인거고 그 이후에 ++ 연산이 일어나고 3으로 진행된 것으로 사료됩니다.일단 대충 이해는 하려면 할 수는 있겠으나 디스어셈블 창을 보면서 순서상으로 어느 부분에서 ++ 연산이 이뤄졌는지 이해가 되지 않아 질문드립니다.aa.png

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

강의 중 설명은 스택을 이용한 스택 머신의 경우 그런 논리로 이해할 수 있다는 것입니다. 그러나 꼭 그렇게 해야 하는 것은 아닙니다. CPU의 특성에 따라 얼마든지 달라질 수 있습니다. 무엇보다 범용CPU 기계어로 번역될 때는 결과가 바르고 최적화와 관련한 문제가 없다면 결국 맞는 것입니다.

스택을 이용한 설명은 여러 방식 중 하나로 이해하시면 되겠습니다. 그리고 a값이 1 증가하는 시점은 mov dword ptr [a], eax 명령이 실행되는 지점 입니다. 그런데 그 전에 eax의 값을 증가시킨 직접적인 연산은 inc eax 명령입니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다.

b = 3 + a++; 연산에서 후위증감 연산자 ++는 식의 평가가 완료된 후에 변수 a의 값을 증가시킵니다. 따라서 이 연산이 진행되는 과정을 세부적으로 살펴보면 다음과 같습니다.

  1. a의 현재 값(예제에서는 2)을 평가하여 이 값을 식에 사용합니다.
  2. 3a의 현재 값을 더합니다. 즉, 3 + 2 = 5가 됩니다.
  3. 연산의 결과(5)를 변수 b에 할당합니다.
  4. 식의 평가가 완료된 후, a의 값이 1 증가하여 a는 3이 됩니다.

어셈블리어 코드를 통해 이 과정을 더 명확히 이해할 수 있습니다. 코드는 다음 단계로 구성됩니다.

  1. mov eax, dword ptr [a]: a의 값을 eax 레지스터로 이동합니다.
  2. add eax, 3: eax에 저장된 값에 3을 더합니다.
  3. mov dword ptr [b], eax: eax의 값을 b에 저장합니다.
  4. mov eax, dword ptr [a]: 다시 a의 값을 eax로 이동합니다.
  5. inc eax: eax에 저장된 값(즉, a의 값)을 1 증가시킵니다.
  6. 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)

clang님의 프로필 이미지
clang

작성한 질문수

질문하기