컴퓨터를 공부하고자 마음먹은지 N일차

[17일차](홍정모의따배c)논리 연산자 Logical operators 본문

🖥C

[17일차](홍정모의따배c)논리 연산자 Logical operators

졸린새 2020. 9. 24. 23:05
728x90

[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문을 두번쓰거나 해야한다.

Comments