AND 연산자에서 좌항이 false 이면 우항은 계산을 아예 안 합니다.
계산해봤자 결과가 false라는 것은 명백한 사실이니까요.
C언어의 옵티마이징 기능 때문일거예요.
이거 끄는 옵션이 어딘가에 있을텐데요.. 없나? -_-+
그래서 우리가 보통 많이 쓰는 이런 문법이 가능한거죠.
char *str = NULL;
if( rand()%2 == 0 ) str = "YaHoo!";
if( str && str++ )
{
printf( "%s", str );
}
rand()값이 2의 배수가 아닐 경우에는 str에 NULL이 들어가 있으므로 str++까지 계산하게되면 무조건 Access violation 이죠.
연산자 우선 순위가 비교 연산자에서는 결합시 좌항 먼저 계산하도록 되어 있습니다.
질문쟁이 님이 쓰신 글 :
: include <stdio.h>
:
: int main(void)
: {
: int a = 0;
: int b = 2;
: int result;
:
: result = a && ++b
:
: printf("a = %d, b= %d, result= %d\n", a, b, result);
:
: return 0;
: }
:
: 위와같이 프로그램을 짜면...
: a = 0, b = 2, result = 0
: 이라는 값이 출력되는데요.
: 연산자 우선순위상 ++b가 먼저 실행되어야 하는거 아닌가요?
: (a && (++b))
: 이렇게 해도 결과는 같게 나오는군요.
: 답변 부탁드립니다.
|