본문 바로가기

C언어

[C언어] 의도한 대로 인수 전달이 되지 않는 함수 호출 (Side Effect)

C언어로 쉽게 풀어쓴 자료구조 책에서

이진탐색트리를 이용한 연락처 구현 문제를 풀던 중

 

구현한 함수를 호출하기 위해 인수를 넣고 함수를 호출했는데 신기한 경험을 했다.

함수를 호출할 때 당연히 왼쪽 인수부터 차례대로 전달되는 줄 알았는데,

 

다음과 같이 예상치 못한 결과가 나왔다.

당시엔 과제하느라 급해서 그냥 코드를 수정하고 넘어갔는데, 

처음 겪는 신기한 현상이라 정리해보려고 한다.

 

당연히 직관적으로 이름을 입력받는 get_name() 부터 실행될 줄 알았는데, get_pnumber()가 먼저 실행되었다.

 

위에 주석처리 된 내용대로 호출하면 변수먼저 입력하고,

그 변수를 인수로 호출하기만 하기 때문에 정상적으로 실행되었다.

 

왜 저런 현상이 일어나나 궁금해서 구글링 해 본 결과 

간단하게 이야기 하면

함수의 인수로 표현식을 넣으면 안된다.

 

https://docs.microsoft.com/en-us/cpp/c-language/side-effects?view=msvc-170 

 

Side Effects

Learn more about: Side Effects

docs.microsoft.com

https://devdocs.io/c/language/eval_order

 

DevDocs

 

devdocs.io

위의 문서들을 참고해 보면 

C언어는 왼쪽에서 오른쪽, 오른쪽에서 왼쪽 순서대로 실행된다는 개념이 없기 때문에,

인수로 표현식이 들어가면, 임의의 순서대로 실행되어서 side effect가 발생하게 된다는 이야기이다.

 

ms docs에서 side effect의 예시로 들어준 것을 보면

add( i + 1, i = j + 2 ); 라는 함수 호출이 있다고 하자

이 두가지의 인수가 실행순서에 따라 함수 호출 결과가 달라지게 된다.

 

i = 1, j = 1 이라고 가정하면,

왼쪽 인수가 먼저 실행될 때 add함수의 인수는 2, 3 이고

오른쪽 인수가 먼저 실행되면 add함수의 인수는 4, 3이다.

 

그래서 위와 같이 함수 호출 표현식의 인수로 또 표현식을 사용하면

side effect가 발생하게 되는 것이다.

 

그래서 함수 인수 실행순서에 의존하게 되는 명령문 작성을 피해야한다고 설명하고 있다,