예측하기 때문에 프로그램의 오류를 감지할 수 없으며 숙련된 프로그래머들이 항상 복잡한 연산을 한줄로 쓰는것을 권장하지 않는 이유도 이런 이유에서이기 때문입니다.
뭔저 사람들이 보통 잘못 이해하고있는 문제를 짚자면
프로그램에서 a++ + ++a + a++; 가 실행될 때에는 보통
a++ + ++a + a++;
3 + ++a + a++; (a 는 4가됨)
3 + 4 + a++;
3 + 4 + 4;
a++ a++ (a는 6이됨)
이렇게 생각할 수 있습니다.
하지만 컴파일러는 연산을 수행할 때 ++ 연산자의 우선순위는 전위와 후위가 확연하게 다른데요
++ 연산자가 전위에 ++a 처럼 되어있으면 컴파일러는 해당 변수가 연산을 수행하기 직전에 수행합니다.
그리고 연산자가 후위에 a++ 처럼 되어있으면 컴파일러는 해당 줄의 연산이 끝나면 수행을 하게 됩니다.
이해를 돕기위해 일단은 질문에 나온 연산을 수행해보도록 하죠.
a = 3
b = a++ + ++a + a++; 연산이 있으면 컴파일러는 우선 a++ + ++a 를 수행합니다. + 는 왼쪽우선 이기 때문이죠.
b = a++ + ++a + a++; 뒤쪽 a 에 ++ 연산자가 전위형으로 붙어있으므로 일단 a를 1 증가시킵니다. a = 4
b = 4++ + 4 + a++; 로 고칠 수 있습니다. 그러므로 이 식을 다시 쓰면
b = 8++ + a++; 가 되겠죠. 그리고 나서는 8 과 a를 더합니다.
b = 8++ + a++; 뒤쪽의 a 는 후위형이므로 이 줄의 연산이 끝나면 증가됩니다. 현재 a는 4이므로
b = 8++ + 4++ (현재 a는 4) 가 됩니다.
연산이 긑나면 b 에는 결과값이 12가 되고, a는 ++ 가 두 번 작용해서 a 는 6이 됩니다.
비슷한 문제를 하나 풀어봅시다.
b = a++ + ++a + ++a;
이 연산식의 답은 어떻게 될까요?
답은 a = 6, b = 13 입니다.
a++ + ++a 는 위와 같으니까 8++ (a는 4) 입니다. 그리고 나서
8++ + ++a 일 때 ++a 는 전위형이므로 a를 1증가시키고 연산을 시작하게 됩니다. 그러므로
8++ + 5 (a는 5) 가 되어 b에는 13이 들어가고, a는 5에서 1증가된 6이 됩니다.
이해를 돕기위해 하나 더
b = ++a + ++a + ++a;
이 연산식의 답은 무엇일까요?
답은 a = 6, b = 16입니다. 연산자의 위치가 하나 바뀌었을 뿐인데 위의 연산보다 무려 3이나 커졌죠?
하나하나 파헤쳐 보겠습니다.
먼저 ++a + ++a 연산을 합니다. ++ 연산자가 전위형으로 두개나 쓰였으므로 일단 a를 두 번 증가킵니다.
a = 5.
즉 5 + 5 가 되므로 10이 됩니다. 그 후에
10 + ++a 연산입니다. 또 전위형이므로 a를 1 증가시킵니다. a = 6 이 되고
10 + 6 이므로 16이 됩니다.
이해가 조금 되셧나요?
++ 가 후위형으로 a++ 처럼 사용되었을 경우에는 그 줄의 연산이 다 끝난뒤에 증가가 되는 것이며
++ 가 전위형으로 ++a 처럼 사용되었을 경우에는 해당 연산이 수행되기 직전에 증가가 되는 것입니다.
A + B + C + D; 인 연산이 있을때 A B C D 를 한꺼번에 더하는것이 아니잖아요?
A + B 를 하고. 그 결과값에 C를 더하고, 또 그 결과값에 D를 더하는 순서로 수행을 합니다. 사람도 비슷하죠
전위형 ++ 는 변수가 연산을 하기 직전에. ++C라면 A+B의 결과값과 C를 더하기 바로전에 C가 증가되는 것입니다.
참고로 제가 실험한 실험 소스를 보여드릴테니 테스트해보시기 바랍니다.
물론 실험용이므로 주석도없고 매너도없습니다.. -_-;;
#include <stdio.h>
void main()
{
int a, b;
a = 3;
b = a++ + ++a + a++;
printf("%d %d\n", a, b);
a = 3;
b = a++ + ++a + ++a;
printf("%d %d\n", a, b);
a = 3;
b = ++a + ++a + ++a;
printf("%d %d\n", a, b);
a = 3;
b = ++a + ++a;
printf("%d %d\n", a, b);
a = 3;
b = a++ + ++a;
printf("%d %d\n", a, b);
a = 3;
b = a++ + a;
printf("%d %d\n", a, b);
a = 3;
b = a + ++a;
printf("%d %d\n", a, b);
}
이걸로 연산자에 대해 더 알게되셨으면 좋겠군요