11. 관계형 연산자와 논리 연산자 사용하기
이번 강의는 두 변수의 관계를 따지는 관계형 연산자와 참 또는 거짓의 논리를 따지는 논리 연산자의 2가지 연산자에 대해서 학습합니다.
> // 관계형 연산자: < 작음, <= 작거나 같음, > 큼, >= 크거나 같음, == 같음, != 다름
> // 논리 연산자: && 논리곱, || 논리합, ! 논리부정
미리보기 강의: 관계형 연산자(Relational Operator) 의사 코드로 표현
11.1. 관계형 연산자
관계형 연산자(비교 연산자;Relational Operator, Comparative Operator)는 두 항이 큰지, 작은지 또는 같은지 등을 비교하는데 사용되며, 관계형 연산자의 결괏값은 논리 데이터 타입의 참(True)을 나타내는 1과 또는 거짓(False)을 나타내는 0으로 출력됩니다.
관계형 연산자의 종류는 다음과 같습니다.
< (작음), <= (작거나 같음), > (큼), >= (크거나 같음), == (같음), != (다름(같지 않음))
다음 코드는 관계형 연산자의 실행 모습입니다.
코드: relational_operator.c
#include <stdio.h>
int main(void)
{
// 3이 5보다 작은지?
printf("%d\n", 3 < 5); // 1 -> True
// 3이 5보다 큰지?
printf("%d\n", 3 > 5); // 0 -> False
return 0;
}
1
0
다음은 관계형 연산자의 사용 예입니다.
표: 관계형 연산자
11.1.1. 관계형 연산자 사용하기
두 변수의 관계를 비교해보는 관계형 연산자를 사용해보겠습니다.
코드: operator_relational.c
// 관계형 연산자(비교 연산자;Relational Operator, Comparative Operator)
// 관계형 연산자: < 작음, <= 작거나 같음, > 큼, >= 크거나 같음, == 같음, != 다름
#include <stdio.h>
int main(void)
{
int x = 3;
int y = 5;
printf("%d\n", x == y); // 0: x와 y가 같은지
printf("%d\n", x != y); // 1: x와 y가 다른지
printf("%d\n", x > y); // 0: x가 y보다 큰지
printf("%d\n", x >= y); // 0: x가 y보다 크거나 같은지
printf("%d\n", x < y); // 1: x가 y보다 작은지
printf("%d\n", x <= y); // 1: x가 y보다 작거나 같은지
return 0;
}
0
1
0
0
1
1
C 언어에서 두 개의 데이터를 비교할 때 사용되는 비교 연산자 중에서 ==
연산자는 데이터가 같은지 확인합니다. 같으면 참(true
- 1
)을 다르면 거짓(false
- 0
)의 데이터인 bool
형식의 데이터가 반환됩니다. 나머지 관계형 연산자도 그 의미에 맞게 논리 형식의 결과가 주어집니다.
C 언어 프로그래밍 언어에서는 ==
, !=
등의 관계형 연산자 없이는 프로그램을 작성할 수가 없습니다. 다른 연산자도 마찬가지로 사용할 때 연산자 기호는 띄어쓰기를 하면 안 되며, 연산자와 피연산자 사이에는 공백을 하나 두는 방식을 추천합니다.
11.2 논리 연산자 사용하기
논리 연산자(Logical Operator)는 논리곱(AND), 논리합(OR), 논리부정(NOT)의 조건식에 대한 논리 연산을 수행합니다. 연산의 결과 값은 참(True) 또는 거짓(False)의 부울(bool) 형식으로 반환되어 불리언(Boolean) 연산자라고도 합니다. 논리 연산자도 비교 연산자와 마찬가지로 결괏값은 참 또는 거짓 값을 반환합니다.
논리 연산자의 종류는 다음 표와 같습니다.
표: 논리 연산자
A항(식)과 B항(식)의 값에 따른 3가지 결과의 논리표(진리표, Truth Table)는 다음과 같이 표시할 수 있습니다.
표: 논리표
11.3 논리 AND 연산자 사용하기
논리 AND 연산자는 둘 다 참일 때에만 참을 반환합니다.
코드: and_operator.c
#include <stdio.h>
int main(void)
{
//[A] 둘 다 참일때에만 참
printf("%d\n", 1 && 1); // 1
//[B] 하나라도 거짓이면 거짓
printf("%d\n", 1 && 0); // 0
return 0;
}
1
0
AND 연산자인 &&
연산자의 4가지 사용 예를 살펴 보겠습니다.
코드: logical_and.c
///[?] 논리 연산자: && -> 논리 AND: 양쪽 다 모두 참일 때에만 참
#include <stdio.h>
int main(void)
{
// && 연산자: AND
printf("1 && 1 -> %d\n", 1 && 1); // 1
printf("1 && 0 -> %d\n", 1 && 0); // 0
printf("0 && 1 -> %d\n", 0 && 1); // 0
printf("0 && 0 -> %d\n", 0 && 0); // 0
return 0;
}
1 && 1 -> 1
1 && 0 -> 0
0 && 1 -> 0
0 && 0 -> 0
실행 결과처럼 &&
연산자는 둘 다 참일 때에만 참을 반환해줍니다.
11.4 논리 OR 연산자 사용하기
OR 연산자인 ||
연산자를 사용해 보겠습니다.
코드: or_operator.c
#include <stdio.h>
int main(void)
{
//[A] 하나라도 참이면 참
printf("%d\n", 0 || 1); // 1
//[B] 둘 다 거짓일때에만 거짓
printf("%d\n", 0 || 0); // 0
return 0;
}
1
0
OR 연산자의 4가지 유형을 살펴보겠습니다.
코드: logical_or.c
// 논리 연산자: || -> 논리 OR: 하나라도 참이면 참
#include <stdio.h>
int main(void)
{
// || 연산자: OR
printf("1 || 1 -> %d\n", 1 || 1); // 1
printf("1 || 0 -> %d\n", 1 || 0); // 1
printf("0 || 1 -> %d\n", 0 || 1); // 1
printf("0 || 0 -> %d\n", 0 || 0); // 0
return 0;
}
1 || 1 -> 1
1 || 0 -> 1
0 || 1 -> 1
0 || 0 -> 0
실행 결과처럼 ||
연산자는 하나라도 참이면 참을 반환하고 둘 다 거짓일 때에만 거짓을 반환해줍니다.
11.5 참고: 단락(Short-Circuiting, short-circuit evaluation) 평가
C 언어에서 단락이라는 기능은 AND 연산과 OR 연산을 진행할 때 부분의 결괏값에 따라서 나머지 연산 결과가 결정되는 기능을 말하며 다음과 같은 두 가지 유형이 있습니다.
- (연산식1 && 연산식2): 연산식1이 거짓(False)이면 연산식2와 상관없이 전체 결과값이 거짓(False)이 됩니다.
- (연산식1 || 연산식2): 연산식1이 참(True)이면 연산식2의 결과값과 상관없이 전체 결과값이 참(True)이 됩니다.
11.6 논리 NOT 연산자 사용하기
NOT 연산자인 ! 연산자를 사용해 보겠습니다. 다음 샘플 코드는 눈으로 본 후 넘어갑니다.
> (1 == 1)
1
> !(1 == 1)
0
> (1 != 1)
0
> !(1 != 1)
1
NOT 연산자는 항이 하나인 단항 연산자입니다.
코드: logical_not.c
// 논리 연산자: ! -> 논리 NOT: 참이면 거짓, 거짓이면 참으로 변환
#include <stdio.h>
int main(void)
{
// ! 연산자: NOT
printf("!1 -> %d\n", !1); // 0
printf("!0 -> %d\n", !0); // 1
printf("!!0 -> %d\n", !!0); // 0
printf("!(!(!0)) -> %d\n", !(!(!0))); // 1
return 0;
}
!1 -> 0
!0 -> 1
!!0 -> 0
!(!(!0)) -> 1
실행 결과처럼 !
연산자는 조건식의 결과를 반대로 바꾸어 줍니다.
이처럼 !
(느낌표) 연산자는 bool
형식 변수의 값을 반대로 변경합니다. true
값이면 false
로 false
값이면 true
로 변경해 줍니다.
11.7 참고: 디버거 사용하기
C 언어에서 코드 분석을 쉽게 하려면 F10(프로시저 단위 실행) 또는 F11(한 단계씩 코드 실행)을 적절히 사용하면 도움이 됩니다. 강의에서 따로 디버그 기능을 언급하지 않는다 하더라도 예제를 분석할 때마다 사용하기를 권장합니다.
11.8 장 요약
이번 강의는 값을 비교하는 관계형 연산자와 논리적인 참 또는 거짓을 다루는 논리 연산자에 대해 다루어보았습니다.
정보처리기능사 실기 문제: 논리 연산자를 사용한 조건 평가
이 문제에서는 C 언어를 활용하여 논리 연산자(||
, &&
)를 사용해 주어진 조건을 평가하고, 그 결과를 출력하는 프로그램을 작성하는 것이 목표입니다. 이 과정에서 >
(크다), !=
(같지 않다), <=
(작거나 같다), <
(작다)와 같은 비교 연산자와 함께 논리 연산자를 사용하는 방법을 이해해야 합니다.
문제: 주어진 조건에 따라 논리 연산을 수행하고, 그 결과를 출력하는 C 프로그램을 작성하시오.
#include <stdio.h>
main()
{
int i = 5, j = 4, k = 1, L, m;
// 논리 연산 수행
L = i > 5 || j != 0;
m = j <= 4 && k < 1;
// 결과 출력
printf("%d, %d\n", L, m);
}
해결 방법:
#include <stdio.h>
를 사용하여 표준 입출력 라이브러리를 포함합니다.main
함수를 정의하여 프로그램의 시작점을 만듭니다.- 정수형 변수
i
,j
,k
를 선언하고 각각 5, 4, 1의 값을 할당합니다. 변수L
과m
은 논리 연산의 결과를 저장할 변수입니다. - 변수
L
에는i > 5 || j != 0
조건의 논리 연산 결과를 저장합니다. 이는 "i가 5보다 크거나 j가 0이 아니면 참"이라는 조건입니다. - 변수
m
에는j <= 4 && k < 1
조건의 논리 연산 결과를 저장합니다. 이는 "j가 4 이하이고 k가 1 미만이면 참"이라는 조건입니다. printf
함수를 사용하여 논리 연산의 결과인L
과m
의 값을 출력합니다.
이 문제는 논리 연산자와 비교 연산자의 사용법을 이해하고, 주어진 조건에 따라 참 또는 거짓을 정확하게 평가하는 능력을 평가합니다.
정보처리기능사 실기 문제: 복합 논리 및 산술 연산
이 문제에서는 C 언어를 사용하여 복합 논리 및 산술 연산을 수행하고, 그 결과를 출력하는 프로그램을 작성하는 것을 목표로 합니다. 이 과정에서 여러 산술 연산자(*
, +
, -
, /
)와 논리 연산자(||
, &&
)를 함께 사용하는 방법에 대해 이해해야 합니다.
문제: 주어진 변수에 대해 복합 산술 연산과 논리 연산을 수행한 후, 그 결과를 출력하는 C 프로그램을 작성하시오.
#include <stdio.h>
main()
{
int a = 5, b = 10, c = 15, d = 30, result;
// 복합 산술 및 논리 연산 수행
result = a * 3 + b > d || c - b / a <= d && 1;
// 결과 출력
printf("%d\n", result);
}
해결 방법:
#include <stdio.h>
를 사용하여 표준 입출력 라이브러리를 포함합니다.main
함수를 정의하여 프로그램의 시작점을 만듭니다.- 정수형 변수
a
,b
,c
,d
,result
를 선언하고, 각각 5, 10, 15, 30의 값을 할당합니다. result
변수에 복합 산술 및 논리 연산 결과를 저장합니다. 이 연산은(a * 3 + b > d) || (c - b / a <= d && 1)
과 같이 평가됩니다. 여기서a * 3 + b > d
와c - b / a <= d && 1
은 각각 별도의 논리 조건을 형성하며, 이들 사이에는 논리 OR 연산자(||
)가 사용됩니다.printf
함수를 사용하여 연산 결과인result
의 값을 출력합니다.
이 문제는 산술 연산과 논리 연산을 혼합하여 사용하는 방법을 이해하고, 주어진 연산을 정확하게 수행하여 결과를 예측하는 능력을 평가합니다.
정보처리산업기사 실기 시험 기출 문제 - 복합 논리 연산식
문제
다음 C 언어 프로그램이 실행되었을 때의 동작을 설명하고, 출력 결과를 예측하시오.
소스 코드 파일명: complex_logical_operations.c
#include <stdio.h>
main()
{
int a = 5, b = 10, c = 15, d = 30, result;
result = a * 3 + b > d || c - b / a <= d && 1;
printf("%d\n", result);
}
입력 예시
이 프로그램은 입력을 받지 않습니다.
출력 예시
1
해설
이 프로그램은 변수 a
, b
, c
, d
및 result
에 대한 복합 논리 연산식을 이용하여 최종적으로 result
의 값을 결정하고 출력합니다.
int a = 5, b = 10, c = 15, d = 30, result;
는 정수 변수a
,b
,c
,d
및result
를 선언하고 초기화합니다.result = a * 3 + b > d || c - b / a <= d && 1;
는 다음과 같은 복합 논리 연산을 수행합니다:a * 3 + b > d
는5 * 3 + 10 > 30
즉,25 > 30
이 거짓이므로0
입니다.c - b / a <= d && 1
는15 - 10 / 5 <= 30 && 1
즉,15 - 2 <= 30 && 1
이며,13 <= 30
이 참이므로1
입니다.- 따라서 전체 식은
0 || 1
이 되며, 이는 참이므로1
입니다.
printf("%d\n", result);
는result
의 값인1
을 출력합니다.
이 프로그램은 복합 논리 연산자(||
, &&
)와 관계 연산자(>
, <=
)를 사용하여 복잡한 조건을 평가하고, 이를 통해 최종적인 불리언 결과를 도출합니다. 이 예제는 조건 연산의 우선 순위와 논리 연산의 결과를 이해하는 데 도움을 줍니다.
정보처리기사 실기 시험 기출 문제 - 논리 연산자
문제
다음 C 프로그램이 실행되었을 때의 동작을 설명하고, 출력 결과를 예측하시오.
소스 코드 파일명: logical_operators_test.c
#include <stdio.h>
main()
{
int i = 5, j = 4, k = 1, L, m;
L = i > 5 || j != 0;
m = j <= 4 && k < 1;
printf("%d, %d\n", L, m);
}
입력 예시
이 프로그램은 사용자로부터 입력을 받지 않습니다.
출력 예시
1, 0
해설
이 프로그램은 논리 연산자(||
, &&
)를 사용하여 두 개의 조건문을 평가하고, 그 결과를 변수 L
과 m
에 할당한 후 출력합니다.
int i = 5, j = 4, k = 1, L, m;
는 변수i
,j
,k
를 각각 5, 4, 1로 초기화하고,L
,m
을 선언합니다.L = i > 5 || j != 0;
는i
가 5보다 큰지 혹은j
가 0이 아닌지를 평가합니다.j
가 0이 아니므로 이 조건은 참이며,L
에는 1이 할당됩니다.m = j <= 4 && k < 1;
는j
가 4 이하이고k
가 1 미만인지를 평가합니다.k
가 1 미만이 아니므로 이 조건은 거짓이며,m
에는 0이 할당됩니다.printf("%d, %d\n", L, m);
는 변수L
과m
의 값을 출력합니다.
이 프로그램은 논리 연산자를 사용하여 복합 조건을 평가하고, 이를 통해 프로그램의 흐름을 제어하는 방법을 보여줍니다.
정보처리기사 실기 시험 기출 문제 - 복합 논리 연산
문제
다음 C 프로그램이 실행되었을 때의 동작을 설명하고, 출력 결과를 예측하시오.
소스 코드 파일명: complex_logical_operation.c
#include <stdio.h>
main()
{
int a = 5, b = 10, c = 15, d = 30, result;
result = a * 3 + b > d || c - b / a <= d && 1;
printf("%d\n", result);
}
입력 예시
이 프로그램은 사용자로부터 입력을 받지 않습니다.
출력 예시
1
해설
이 프로그램은 복합 논리 연산을 수행하여 결과를 result
변수에 할당하고, 그 결과를 출력합니다.
int a = 5, b = 10, c = 15, d = 30, result;
는 변수a
,b
,c
,d
를 초기화하고, 결과를 저장할 변수result
를 선언합니다.result = a * 3 + b > d || c - b / a <= d && 1;
연산은 다음과 같이 수행됩니다:a * 3 + b
는 5 * 3 + 10 = 25이며, 이는d
(30)보다 작습니다.c - b / a
는 15 - (10 / 5) = 15 - 2 = 13이며, 이는d
(30)보다 작거나 같으므로 참입니다.c - b / a <= d && 1
에서&& 1
은 논리적 AND 연산의 뒤쪽에 위치하며, 항상 참입니다.- 최종적으로
a * 3 + b > d || c - b / a <= d && 1;
는 참이 됩니다.
- 따라서,
result
에는 1이 할당되고, 이는 참을 나타냅니다. printf("%d\n", result);
는result
의 값을 출력합니다. 결과적으로 1이 출력됩니다.
이 프로그램은 복잡한 논리 연산을 사용하여 조건을 평가하고 결과를 도출하는 방법을 보여줍니다.