[17일차](홍정모의따배c)논리 연산자 Logical operators
*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시
안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.
정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고
제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소
생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면
'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.
어떤 논리연산자가 있는가
- &&
and
좌우측 모두 사실이어야 트루다.
단 좌측이 거짓으로 판명날시 우측 연산은 무시한다.
- ||
or
좌우측중 하나만 사실이어도 트루다.
- !
사실이 아니면 트루다.
이해하기가 다소 힘들겠지만 예제로 함께보자.
- 교수님코드
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool test1 = 3 > 2 || 5 > 6;
bool test2 = 3 > 2 && 5 > 6;
bool test3 = !(5 > 6);
printf("%d %d %d\n", test1, test2, test3);
return 0;
}
test1에서 3이 2보다 크지만 우측은 5가 6보다 크다는 거짓말을 치고있다
하지만 ||연산자 이기 진실인 좌측 때문에 결과값이 1이 나온다.
test2에서 3이 2보다 크지만 우측은 5가 6보다 크다는 거짓말을 치고있다
하지만 &&연산자 이기 때문에 거짓인 우측때문에 결과값이 0이 나온다.
test3에서 5가 6보다 크다는 거짓말을 치고있다
!이라는 NOT을 의미하는 연산자를 사용하고있기 때문에 결과값이 1이 나온다.
- 교수님코드
#include <stdio.h>
#include <stdbool.h>
#define PERIOD '.'
int main()
{
char ch;
int count = 0;
while ((ch = getchar()) != PERIOD)
{
count++;
}
printf("%d", count);
return 0;
}
입력할만큼 글자 수를 입력하고 .을 넣으면
입력이 끝나면서 글자수가 몇개인지 카운트한다.
하지만 공백과 줄을 넘기는 이스케이프시퀀스까지 세어버린다.
#include <stdio.
#define PERIOD '.'
int main()
{
char ch;
int count = 0;
while ((ch = getchar()) != PERIOD)
{
if (ch != '\n' && ch != ' ')
count++;
}
printf("%d", count);
return 0;
}
여기서 의문점
- 과연 if문을 중첩해서 사용해도 결과가 동일하게 나오는가?
된당!
- 교수님코드
#include <stdio.h>
#include <iso646.h> //and, or, not을 쓰기위함
int main()
{
bool test1 = 3 > 2 or 5 > 6;
bool test2 = 3 > 2 and 5 > 6;
bool test3 = not(5 > 6);
printf("%d %d %d\n", test1, test2, test3);
return 0;
}
|| 나 &&, ! 말고도 문자로 직관적으로 나타나게 해주는 헤더도 있다
iso646.h를 쓴다면 저렇게 나타낼 수 있는데 잘은 안쓴다고한다.
그리고 연산자를 한줄에 중첩해서 사용도 가능하다.
int a = 1, b = 2, c = 3, d = 4;
a > b && b > c || b > d;
이런식으로 활용도 가능하지만 순서를 공식대로 유추해야 하는 번거러움이 있다.
고수들은 이런거 보고 한번에 알아보겠지
하지만 역시
((a > b) && b > c) || b > d;
이런식으로 연산순서를 확실하게 구분지어주는게 좋겠다.
- 교수님코드
#include <stdio.h>
int main()
{
int temp = (1 + 2) * (3 + 4);
printf("Before : %d\n", temp);
if (temp == 0 && (++temp == 1024))
{
};
printf("After : %d\n", temp);
return 0;
}
여기서 After가 출력되는 문에서 temp의 값이
if안에 있는 증가연산값을 거쳐서 올까?
정답은
안된다
&&연산자는 좌값부터 읽는데 좌에서 거짓으로 판명나면 연산을 멈춰버린다
- 교수님코드
#include <stdio.h>
int main()
{
int x = 1, y = 2;
if (x++ > 0 && x + y == 4)
printf("%d %d\n", x, y);
return 0;
}
과연 저 연산에서
x가 증가연산 된후 우측값에 2로 대입되어서 참이 되어
결과가 출력될것인가
네 됩니다
왜냐면
논리연산자가 시퀀스포인트 역할을 하기때문에
x++ > 0 이 &&를 만난순간
x에 1이 증가된 값이 우측 x에 대입된다.
- 교수님코드
#include <stdio.h>
int main()
{
for (int i = 0; i < 100; ++i)
if(i >= 10 && i <= 20)
printf("%d ", i);
printf("\n");
for (int i = 0; i < 100; ++i)
if (10 <= i <= 20)
printf("%d ", i);
return 0;
}
중간에 이스케입시퀀스를 출력하는 출력문을 기점으로
위에코드는
1부터 100까지 반복하는 반복문에서
&&연산자를 활용하여 10이상인 수와 20이하인 수만 출력한다
즉 10 ≥ i ≤ 20 인셈이다 .
허나 10 <= i <= 20 그대로 if문에 했을 시에 무사히 원하는 값을 출력하냔 말이다.
컴파일하면
안되는 거시다
즉 논리연산자 사용이 헷갈릴땐 if문을 두번쓰거나 해야한다.