[C언어] 논리 연산자 && || !

ET의 공부/C언어|2020. 12. 16. 23:22

논리 연산자란?

논리 연산자(Logical Operator)는 보통 논리적(Boolean) 값과 함께 쓰이며, 불리언 값을 반환합니다. 불리언 연산은 참(True,T,1) 또는 거짓(False, F, 0)으로 표현됩니다. 컴퓨터 공학에서는 조건에 의한 분기나 반복을 만드는데 사용되며, 디지털 논리 회로는 0과 1로 구성되어 있기때문에 디지털 논리 회로에서도 유용하게 사용됩니다. 이번 포스팅에서는 C언어에서 자주 사용하는 논리 연산자인 AND(&&), OR(||), NOT(!)에 대해 설명하겠습니다.

 

 

논리곱 AND(&&)

논리곱(AND)란 수학 논리학에서, 주어진 복수 명제가 모두 참인지를 나타내는 논리 연산입니다. 논리곱은 임의의 명제를 나타낼때, '그리고'라는 논리적 언어로 연결된 합성명제입니다.

 

논리곱의 진리표

논리곱의 연산은 1&&1일때만 참 즉, 참(1)과참(1)일 때만 참을 반환하는 연산입니다.

 

논리합 OR(||)

논리합(OR)은 수리 논리학에서 주어진 복수 명제에 적어도 1개 이상의 참이 있는지를 나타내는 논리 연산입니다. 논리합은 임의의 명제를 나타낼때, '또는'이라는 논리적 언어로 연결된 합성명제 입니다.

 

논리합의 진리표

논리합은 위의 논리곱과 다르게 둘중 하나만 참(1)값이 있으면 참을 반환하는 것을 보실수 있습니다.

 

논리부정 NOT(!)

부정입니다. 즉, 참 과 거짓을 뒤집는 연산입니다.

 

논리부정의 진리표

 

논리 연산자의 사용 이유?

 

논리 연산자는 조건에 의한 분기나 반복을 만드는데 사용합니다. 예를들어 "대한민국 국적의 160cm이상 200cm이하의 남성은 군대를 간다"  라는 명제가 있으면 단순 관계표현식으로는 아래와 같이 구현할수있습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
int main(){
 
char Nationality[10= "Korea";
char gender[10= "Man";
int height = 171;
if(!strcmp(Nationality,"Korea")){ //국적 판별
     if(!strcmp(gender,"Man")){.   //성별 판별
         if(height >= 160){.       //키 판별1
             if(height <= 200){.   //키 판별2
                 printf("army go\n");
             }
         }
     }
}
   return 0;
}

 

국적,성별,키(크거나작다)를 판별하기위해 4개의 조건문과 관계표현식이 사용되었습니다. 이를 논리연산자를 사용해서 코드의 크기를 줄여보겠습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
int main(){
    char Nationality[10= "Korea";
    char gender[10= "Man";
    int height = 171;
  
    if!strcmp(Nationality,"Korea"&& !strcmp(gender,"Man"&&  (height >= 160&& (height <= 200)  ){
        printf("army go\n");
    }
 
    return 0;
}
 

 

위와 같이 하나의 조건문으로 같은 코드의 크기를 줄일 수 있게 되었습니다.

if!strcmp(Nationality,"Korea"&& !strcmp(gender,"Man"&&  (height >= 160&& (height <= 200)  )의 명제를 살펴보면 

국적이 한국 (그리고) 성별이 남자 (그리고) 키가 160cm 이상 (그리고) 키가 200cm 이하 를 만족해야하 "army go"라는 문자가 출력이 되게 됩니다. 위의 코드에서는 논리곱(AND)만이 아닌 논리부정(NOT)도 사용이 되었는데 문자열을 비교하는 함수인 strcmp()의 반환값은 참일 경우 0이기 때문에 그대로 사용할 경우 위의 논리연산에서는 거짓으로 인식이 됩니다. 따라서 논리부정(NOT) !을 사용하여 참일경우 참(1)을 반환하게 반환값을 반전시켜 줍니다.

 

이로서 논리곱과 논리부정을 알아 보았는데 다음으로는 논리합(OR)에 대해 알아보겠습니다. 

간단하게 "A라는 물건은 40cm 또는 100cm 여야 한다" 라는 명제가 있습니다. 이는 "A는 40cm OR 100cm" 로 표현되므로

 

 

1
2
3
    if(A == 40 || A == 100){
        printf("this is A\n");
    }

 

if(A == 40 || A == 100)으로 구현할수 있습니다. 

감사합니다.

댓글()