제 22 강 논리식 및 논리 값 shcho.pe.kr
C 언어의 논리식: 어떠한 수식도 논리식으로 사용될 수 있음. 논리:logic, 2분 논리, 참-거짓, 흑백논리 C 언어의 논리식: 어떠한 수식도 논리식으로 사용될 수 있음. 산술 연산, 비교 연산, 논리 연산 값이 0이면 false (거짓) 그렇지 않으면 참으로 해석한다. if, while, for 등에 사용
예 while (2>1){ ... } while(1) printf(“Hello.\n”); if (0.1) … for (i=0; i<10; i++) sum+= i; n=6; while (n){ sum += n; n--; }
비교 연산 <,>,<=,>= ==,!= no spaces in between 비교연산 식의 값: (a==b) 옳음 (a= =b) 그름 비교연산 식의 값: 참이면 1, 아니면 0 * 비고: 0이면 false, 아니면 참
Confused ? 1 과 0 ? non-zero 와 zero ? 각종 논리 연산의 결과는 0 또는 1이 됨 임의의 수식을 true/false로 해석해야 한다면 non-zero는 true로 해석하고 0는 false로 해석함
예제 Q: (1==1) A: 1 Q: int a=24; (a != 23) Q: 3<3 A: 0 Q: 3 == 3.0/10.0*10 ??
다음 shcho.pe.kr
Q22_01
산술 연산과 섞어 쓰기 int a,b; a+b < c+d ≡ (a+b) < (c+d) 즉, 산술 연산을 비교 연산 보다 먼저 계산. 1<2 + 3<4 ≡ ?
논리값은 정수 printf(“%d\n”, 1==1); printf(“%d\n”, 1==1+1); printf(“%d\n”, 1>=2); printf(“%d\n”, (1==2)<1); printf(“%d\n”, (1!=2)>(1==1)); printf(“%d\n”, (2>1)/2);
수학에서의 식과 차이 3<4<5 true , 1? 그러나… 3<4<5 ≡ (3<4)<5 ≡ 1 < 5 ≡ 1 4<3<5 ≡ (4<3)<5 ≡ 0 < 5 ≡ 1 절대 쓰지 말 것 수학에서의 a<b<c 는 (a<b) && (b<c)
다음 shcho.pe.kr
Q22_02
논리 연산 함수: 논리 값 논리값 x y x && y x || y !x 1
실습 lab22_01/rectangle.c 사각형을 left, right, top, bottom의 4개 값으로 나타내자. 사각형의 4개 좌표를 scanf로 입력 받는다. 새로운 점의 x와 y 값을 입력 받는다. 이 점이 사각형의 내부에 있는 지 (경계선 포함) 그렇지 않은 지 판단하여 “내부” 또는 “외부”로 출력하는 프로그램을 작성하라. 여러 조건을 동시에 만족하는지를 테스트하기 위해서는 &&를 사용한다. 파일명: rectangle.c left right x top * 주의: 컴퓨터에서는 y 값은 아래로 갈수록 큰 수가 된다. bottom y
실습 lab22_02/rectangle2.c lab23_01과 같은 일을 하는 프로그램을 작성하되 이번에는 &&를 전혀 쓰지 않고 대신 ||를 사용하라. Hint: 안에 있는가를 묻지 않고 바깥에 있는가를 물으면 된다. 파일명: rectangle2.c
실습 lab22_03/side.c 22_03.txt i=j=k=0; if ((i-- >0) && (j-- >0)) k++; printf("%d %d %d\n",i,j,k); i=j=k=1; 프로그램을 하기 전에 출력 값을 예측해보자. 여기서 알 수 있는 것은 어떤 사실인가 생각하여보라 (22_03.txt 에 작성)
Short-circuit evaluation f1 && f2 f1이 true일 때만 f2를 evaluate 한다 f1 || f2 f1이 false일 때 만 f2를 evaluate 한다 순서는 좌에서 우로 !
&& , || 와 연속된 if if(A && B) { ... } if (A){ if (B) { ... } } if (A || B) {...} if (A){...} else if (B){...}
lab22_04/side2.c if ( (i-- >0) && (j-- >0) ) printf("둘 다 0보다 크다."); printf("i=%d j=%d\n", i, j); 위의 코드를 수정하여 && 대신 두 개의 if로 바꾸어서 프로그램을 완성하라. i, j의 값은 scanf로 입력한다.
논리 부정 !(논리식)은 논리 값의 반대를 형성 !1은 0 !!1은 1 !0은 1 !!0은 0 !99는? !!99는 반대의 반대니까 99?
Summary 정수 값을 논리 값으로 조건의 참/거짓으로 사용 조건의 만족 여부: zero/non-zero 각종 논리 연산의 결과: 1/0으로 나온다 대소 비교, 동등 비교, 논리 합/곱 정수 연산과 섞어 쓸 수 있다 수학에서의 비교 식과 혼돈은 금물
제 22 강 끝. shcho.pe.kr