다음과 같은 코드가 있다.


int a = 10, b = 5, m = 1, result = 0;


if( ! ( ( a < b ) && ( m++ == 1 ) ) )

{

printf("Hello ");

}


if( m == 1 )

{

printf("World");

}


이 코드의 결과는 놀랍게도 


Hello World


이다.


분명 조건 검사에서 m++가 수행되면서 맨 뒤의 World가 나오지 않아야 했는데

나오는 이유가 뭘까?



그건 컴파일러의 논리연산자에 대한 스마트함 때문이다.


&& 논리연산자로 묶여있는 두 조건식에서 앞의 조건식 a < b는

이미 a = 10이고 b = 5이기 때문에 a < b 라는 조건이 이미 틀렸기 때문에

컴파일러는 && 뒤의 조건식을 검사하지 않고 그대로 빠져나온다.


이 후, ! 부정연산자를 통해 결국 부정 + 부정은 참이되고 Hello가 출력되며

뒤의 m++의 후위연산자는 계산되지 않고 그대로 m == 1을 유지하기 때문에

World 역시 출력되는 것이다.



역시 재밌다. 컴파일러의 세계는.


그리고 if 조건 검사에서 조건 검사 식이 2개일 경우에는 비교 횟수가 기본적으로 2번 일어나고,

만약 방금과 같은 논리연산자가 개입한다면 1번 일어날 수도 있다는 것을 기억하자.


왜냐하면 이제야 알았지만 과거 기업 필기 시험에서 if 조건검사 횟수를 물어보는 문제가 있었는데

아마 그 문제의 속 뜻이 이런 문제였다는 이제야 알게되었다.



흐하하핫!!




+ Recent posts