함수 매개변수 평가 순서

C 표준 컴파일러에서 함수 매개변수 평가 순서는 따로 정해져있지 않다.

#include <stdio.h>
int main(){
    int a = 0;
    printf("%d %d %d\n", a, ++a, ++a);
}

위의 코드를 실행하면 어떤 결과가 나올까요?

많은 분들이 0 1 2를 예상하셨겠지만 놀랍게도 2 2 2 로 나오게 됩니다.

이것으로 a, ++a, ++a 가 모두 끝난 뒤에 printf가 동작했다는 것을 유추할 수 있습니다.

즉, 매개변수의 평가가 모두 끝난 뒤에 함수가 실행되는 것입니다.

그렇다면 아래 코드의 실행 결과는 어떨까요?

#include <stdio.h>
int print(int a){
    printf("%d ",a);
    return a;
}
void f(int a, int b, int c){
}
int main(){
    f(print(1),print(3),print(5));
}

실행 결과는 5 3 1로, 전달인자가 오른쪽부터 평가된 것을 알 수 있습니다.

실제로, C 표준 컴파일러에서 함수 매개변수의 평가 순서는 따로 정해져있지 않습니다.

따라서 매개변수에 실행 순서가 중요한 함수나 어떤 식을 전달하게 된다면 의도한 결과가 나오지 않을 가능성이 높습니다.

위의 코드는 아래와 같이 바꾸는 것이 좋습니다.

#include <stdio.h>
int print(int a){
    printf("%d ",a);
    return a;
}
void f(int a, int b, int c){
}
int main(){
    int a = printf(1), b = printf(3), c = printf(5);
    f(a,b,c);
}

© 2018. All rights reserved.

Powered by Hydejack v8.5.2