C언어 논리연산자 - ceon-eo nonliyeonsanja

관계 연산자는 <, >, 뭐 이렇게 생겨먹어서 대충 필수 교육 과정을 거치면 의미를 이해하기 쉽다.

보다 크다, 작다 뭐.. 근데 논리연산자는 생겨먹은게 &&, ||, ! 뭐 이렇게 생겼다. 저게 뭐지 뭐 느낌표는 팩토리얼인가...

논리 연산자

연산자 의미 기본 형식 기능
&& 논리곱 (and) x && y x와 y의 값이 모두 참이면 참 하나라도 거짓이면 거짓
|| 논리합 (or) x || y x나 y 중 하나라도 참이면 결과값은 참. 둘다 거짓이면 거짓
! 논리부정 (not) !x x의 논리 값이 참이면 거짓, 거짓이면 참

- && and연산자라고도 한다. 보통 조건문 같은대서 모든 조건을 만족시켜야할 경우에 사용하곤 한다.

int a = 3;
int b = 4;

if( a < 10 && b < 10) {
	//실행문
}

위 코드와 같이 && 연산자 기준으로 a < 10 도 참이고 b < 10 도 참이므로 if문 안으로 들어가서 실행문을 읽게 된다.

- || 이것은 키보드에 Enter 위에 원화 표시(다른 위치인 경우도 있다 대부분 근처) \ 이것을 Shift누르고 입력하면 된다.

논리합 or연산자라고도 하는데 이것은 두 조건 중 하나라도 만족시키면 실행시킬 때 사용한다.

아래 코드로 확인해보면

C언어 논리연산자 - ceon-eo nonliyeonsanja

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include<stdio.h>

main() {

int score;

printf("점수 입력 : ");

scanf("%d"&score);

while (score < 0 || score > 100) {

printf("0 ~ 100 수 입력하세요\n");

scanf("%d"&score);

}

if (score >= 80 && score <= 100)

printf("합격");

else

printf("불합격");

}

cs

C언어 논리연산자 - ceon-eo nonliyeonsanja

9행 : while문 score가 0보다 작거나 또는(or) 100보다 크면 반복문을 실행한다.

처음 입력 때 -30을 입력해 score < 0 이 수식에 참이 들어가서 while문 안으로 들어간다.

두번 째 입력 했을 때 110을 입력해 100보다 큰 수식이 참이 들어가 while문 안으로 들어간다.

세번째 85 입력은 0보다 크고 100보다 작아 두 수식 거짓으로 들어가서 while문을 타지 않는다.

13행 : score가 80보다 크거나 같고(and) score가 100보다 작거나 같으면 참이 되어 if문을 실행한다.

아니면 else문으로 가고

문맥 의미상 or, and 연산자 그대로 해석하면 이해가 간다.

! 연산자는 수식 반대로 생각하면 된다.

a = 100;
b = 3;

if(!a<b){
	//실행문
}

a가 100 b가 3 a < b 는 b가 작으므로 거짓이지만 ! 가 붙어서 거짓은 참으로 바꾸게 되므로 if문 안으로 들어간다.


이제 if 조건문에 논리 연산자를 사용해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

if_logical_operator.c

#include <stdio.h>
 
int main()
{
    int num1 = 1;
    int num2 = 0;
 
    if (num1 && num2)      // num1과 num2가 모두 참인지 검사
        printf("참\n");
    else
        printf("거짓\n");  // num1만 참이므로 거짓이 출력됨
 
    if (num1 || num2)      // num1과 num2 둘 줄 하나가 참인지 검사
        printf("참\n");    // num1이 참이므로 참이 출력됨
    else
        printf("거짓\n");
 
    if (!num1)             // num1을 반대로 뒤집음
        printf("참\n");
    else
        printf("거짓\n");  // 참을 뒤집었으므로 거짓이 출력됨
 
    return 0;
}

실행 결과

거짓
참
거짓

변수에 10을 할당한 뒤 if 조건문 안에서 논리 연산자를 사용하였습니다. 여기서 num1에는 1, num2에는 0이 들어있으므로 AND 연산자의 결과는 거짓이며 OR 연산자의 결과는 참입니다. 또한, num1에 저장된 1을 뒤집었으므로 결과는 거짓입니다. 각자 변수에 다른 값을 넣어서 실행해보세요.

if 조건문에서 논리 연산자를 사용하면 단락 평가에 따라 동작이 결정됩니다. 다음 if 조건문에서 && 연산자는 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정하므로 else의 코드가 실행됩니다. 그리고 ||연산자는 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정하므로 if의 코드가 실행됩니다.

int num1 = 0;
int num2 = 1;

if (num1 && num2)       // 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정
    printf("참\n");
else
    printf("거짓\n");   // 거짓 출력

num1 = 1;
num2 = 0;
if (num1 || num2)     // 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정
    printf("참\n");   // 참 출력
else 
    printf("거짓\n");

참고 | 단락 평가의 활용

&& 연산자의 단락 평가를 활용하면 문제가 발생하는 코드를 미리 예방할 수 있습니다.

int num1 = 0;
int num2 = 10;

if ((num1 != 0) && (num2 / num1) < 20)    // num1이 0이면 나눗셈 연산을 하지 않음.
    printf("참\n");
else
    printf("거짓\n");

정수를 0으로 나누면 에러가 발생하지만 나눗셈 연산 전에 (num1 != 0) &&와 같이 num1이 0인지 검사하면 에러를 예방할 수 있습니다. 즉, && 연산자에서 첫번째 조건이 만족하지 않으면 두 번째 조건은 검사하지 않는 특성을 이용한 것입니다.

단락 평가는 논리 연산자로 된 조건 검사뿐만 아니라 사칙 연산 수행에도 적용됩니다.