일단 참, 거짓에 대한 이야기부터 해야겠네요.
C 언어의 조건검사에서 숫자 "0"은 거짓으로 해석되고 "0"이 아닌 수는 모두 참으로 해석합니다.
그 다음으로 && (AND) 연산과 || (OR) 연산에 대해서도 이야기 해보겠습니다.
AND 연산은 A "이고" B 일때 만족합니다.
- 난 어리고 이쁜 아가씨만 만난다.
---> 이런 경우가 바로 AND 연산이죠. 두 가지 조건을 *모두* 만족해야 합니다.
OR 연산은 A "이거나" B 일때 만족합니다.
- 난 어리거나 이쁜 아가씨면 만난다.
---> 이럴 경우는 OR 연산입니다. 두 가지 조건 중에 *한 가지라도* 만족하면 됩니다.
여기서 한가지 더 알아두어야 할게 있는데...
그게 뭔가하면...
or 연산자는 두가지 조건을 모두 끝까지 살펴봐야 참인지 거짓인지를 알 수 있습니다.
당연한거죠... 두가지 중에 한가지라도 만족하면 참이니깐요.
미팅 껀수가 생겼다.
상대가 어린 아가씨 인가 확인! -> 나이 많은 아가씨다.
첫번째 조건을 만족하지는 못했지만 여기서 낙담하지 않고 이쁜지 확인해보자.
-> 이쁘다 ---> 앗싸 미팅 계속
and 연산자는 두가지 조건 중에 하나라도 만족 못하면 나머지 조건을 체크하지 않고
중간에 그만둬 버립니다. 당연한거죠!
미팅을 껀수가 생겼다.
상대가 어린 아가씨 인가 확인! -> 나이 많은 아가씨다. --> 미팅 안함.
난 (1. 젊고) (2. 이쁜 ) 아가씨라야 미팅을 한다고 마음을 굳게 먹었습니다.
두가지 조건을 모두 만족해야 하는데... 첫번째 조건부터 삐꾸가 났다면
두번째 조건은 따로 더 살펴볼 필요가 없겠죠?!
나이 많고 이뻐도,
나이 많고 안 이뻐도 내가 미팅을 안할거라는 사실은 변함이 없기 때문입니다.
그래서 && 연산자를 수행할 때에는 효율성을 높이기 위해
중간에 조건을 만족시키지 못하는 경우가 생기면 다음 조건은 체크하지 않고 바로 건너 뛰어버립니다.
자~~ 이제 부터 님께서 올린 소스를 보고 설명해볼게요.
딴 라인은 다 제쳐두고 /* a줄 */ 만 살펴보겠습니다.
: (i=0)&&(j=3); /* a줄 */
편의상 다음과 같이 살펴보겠습니다.
(i=0) && (j=3);
*A* *B*
&& 연산자 왼쪽에 있는 조건식부터 체크를 합니다. 바로 (i=0) 이죠.
그런데 (i=0) 은 조건식이 아닙니다.
그냥 문장이지만 컴퓨터는 시키는데로 수행을 합니다.
1. i에 0을 대입합니다.
2. 그 다음에 i 값을 체크합니다.
조건식에서 0은 거짓이고, 0 이외의 값은 참이라고 위에 설명했지요?
3. i 값을 체크하니깐 0 입니다. 0은 거짓!!!
그래서 && 연산을 만족시키지 못합니다. 이미 거짓이라는 게 확정되었기 때문에
&& 오른쪽에 있는 식은 따로 보거나 체크하지 않고 그냥 넘겨버립니다.
그래서 j = 3 이라는 문장을 실행이 되지 않는거지요.
위에 1번에서 i에 0을 대입했기 때문에 i는 0이 되고
j 에는 처음 2를 대입한 뒤로 따로 건들지 않았기 때문에 그대로 2 값이 남아 있는 겁니다.
충분한 설명이 되었나 모르겠습니다... 그럼~~~ (^^)
|