4과목, 5과목이 기술되어있는 2권 33페이지 2번 문제의 풀이과정에 오류가 있는 것 같습니다.
문제와 풀이과정은 다음과 같습니다. (정답에는 문제가 없습니다.)
a=3, b=4, c=5, d=6
d % b + ++a * c-- || c - --a >= 10
2 + 3 * 5 || c - 3 >= 10
2 + 15 || c - 3 >= 10
17 || 2 >= 10
17 || 0
1
여기서 연산자 우선순위를 적용해 --와 ++을 오른쪽부터 왼쪽으로 순차적으로 계산하는 모습을 볼 수 있습니다.
하지만 제가 알기로는 계산은 연산자 우선순위가 낮은 연산자부터 표현식을 나누어 트리와 같은 형태를 만들고, 해당 트리를 후위 순회하는 형태로 컴파일되는 것으로 알고 있습니다.
expr || expr // 이 수식은 왼쪽 표현식, 오른쪽 표현식, or 연산이 순서대로 진행됩니다. 왼쪽 표현식이 계산되는 과정에서 오른쪽 표현식은 어떤 형태로든 관여할 수 없습니다.
예를 들어, or(a + b, --a + b++)라는 식으로 기술하면, 왼쪽의 'a + b' 부분이 가장 먼저 계산되고, 그 다음 오른쪽의 --a가 계산되는 형태입니다.
그걸 증명하기 위해, 식은 그대로 두고 각 변수의 값만 변경하여 c언어 프로그램을 작성했습니다.
#include
int main() {
int a = -10, b = 4, c = 0, d = 8;
int e = d % b + ++a * c-- || c - --a >= 10;
printf("%d", e);
}
교재의 생각이 맞다면 식은 다음과 같이 전개될 것입니다.
a = -10, b = 4, c = 0, d = 8
d % b + ++a * c-- || c - --a >= 10
0 + (-10) * 0 || c - (-10) >= 10
0 + 0 || c - (-10) >= 10
0 || 10 >= 10
0 || 1
1
제 생각이 맞다면 식은 다음과 같이 전개될 것입니다.
a = -10, b = 4, c = 0, d = 8
d % b + ++a * c-- || c - --a >= 10
0 + ++a * c-- || c - --a >= 10
0 + (-9) * 0 || c - --a >= 10
0 || c - --a >= 10
0 || -1 - (-10) >= 10
0 || 9 >= 10
0 || 0
0
위의 함수가 작성된 파일을 gcc -o gongbu.exe gongbu.c 명령어로 cmd로 컴파일한 결과 0이 나왔습니다.
긴 글 읽어주셔서 감사합니다.
[간단한 요약]
a = 0
a && a++ + ++a
위 수식은 왼쪽이 먼저 계산되므로 0이 나와야 함
근데 책에서는 마치 ++이 먼저 계산되는것처럼 표현하여, 위 수식이 1이 나올거라고 오해할 소지가 있음
안녕하세요 길벗수험서 운영팀입니다.
놓치고 있던 부분을 확실히 짚어주신 점 감사합니다.
해당 부분에 대해서는 추가로 자문을 얻어 내용을 보충함으로써 다른 수험생이 혼동을 겪지 않도록 수정토록 하겠습니다.
잘못된 내용으로 학습에 불편을 드려 사과드립니다.
행복한 하루되세요 :)
-
관리자2024-02-08 13:25:30
안녕하세요 길벗수험서 운영팀입니다.
놓치고 있던 부분을 확실히 짚어주신 점 감사합니다.
해당 부분에 대해서는 추가로 자문을 얻어 내용을 보충함으로써 다른 수험생이 혼동을 겪지 않도록 수정토록 하겠습니다.
잘못된 내용으로 학습에 불편을 드려 사과드립니다.
행복한 하루되세요 :)