4장. 연산자
#include <stdio.h>
int main(void) {
int num;
printf(“Please enter an integer: ");
scanf("%d", &num);
if ( num < 0 )
printf("Is negative.\n");
printf("num = %d\n", num);
return 0;
}
■ 수식의 개념과 연산자 , 피연산자에 대해서 알아본다 .
■ C 의 연산자의 종류를 알아본다 .
■ 연산자의 우선 순위와 결합 방향에 대하여 알아본다 .
학습목표
연산자의 기본 개념
• 수식
• 연산자와 피연산자
연산자의 종류
• 산술 연산자 / 증감 연산자
• 관계 연산자 / 논리 연산자
• 비트 연산자 / 대입 연산자
• 조건 연산자 / 형변환 연산자
연산자의 우선순위와 결합 방향
목차
수식(expression)
값을 갖는 요소
수식의 값을 구하는 것을 ‘수식을 평가한다’고 한다.
연산식 : 연산자를 이용한 수식
연산자(operator)와 하나 이상의 피연산자(operand)로 구성
수식
연산자의 기본개념
연산자(operator)
연산에 사용되는 기호
+, -, ++, --, ==, >, <, &&, ||, <<, >> 등
피연산자(operand)
연산의 대상이 되는 값
연산자와 피연산자
연산자의 기본개념
연산자의 종류(1/2)
피연산자의 개수에 따른 연산자의 종류
연산자와 피연산자
연산자의 기본개념
연산자의 종류(2/2)
연산자의 기능에 따른 연산자의 종류
연산자와 피연산자
연산자의 기본개념
산술 연산자
기본적인 사칙 연산 기능을 제공하는 연산자
산술 연산자
연산자의 종류
산술 연산자의 사용 예(1/2)
산술 연산자
연산자의 종류
01: /* Ex04_01.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int num1, num2;
07: int result;
08:09: printf("두 개의 정수를 입력하세요 : ");
10: scanf("%d %d", &num1, &num2);
11:12: result = num1 + num2;
13: printf("%d + %d = %d\n", num1, num2, result);더하기
산술 연산자의 사용 예(2/2)
산술 연산자
연산자의 종류
18: result = num1 * num2;
19: printf("%d * %d = %d\n", num1, num2, result);
20:21: result = num1/ num2;
22: printf("%d / %d = %d\n", num1, num2, result);
23:24: result = num1 % num2;
25: printf("%d %% %d = %d\n", num1, num2, result);
26:27: return 0;
28: }
곱하기
나누기
나머지
나누기 연산자(/)
정수에 대하여 나누기 연산자(/)를 사용하면, 소수점 이하는 버리고(truncation) 몫을 정수로만 구한다.
나머지 연산자(%)
정수형에 대해서만 사용 가능
산술 연산자
연산자의 종류
나머지 연산자의 사용 예
산술 연산자
연산자의 종류
01: /* Ex04_02.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int num;
07: int thousands, tens;
08:09: printf("6자리 정수를 입력하세요 : ");
10: scanf("%d", &num);
11:12: thousands = num / 1000;
13: tens = num % 1000;
14: printf("%d,%d\n", thousands, tens);
15:16: return 0;
나머지 연산자 사용
증감 연산자
변수의 값을 1만큼 증가시키거나 감소시킨다.
증감 연산자는 반드시 변수에만 사용해야 한다.
전위형과 후위형
증감 연산자
연산자의 종류
증감 연산자의 사용 예(1/2)
증감 연산자
연산자의 기본개념
01: /* Ex04_03.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int count;
07: int value1, value2;
08: float temperature = 10.5f;
09:10: count = 10;
11: value1 = ++count;
12: printf("value1 = %d, count = %d\n", value1, count);
13:14: count = 10;
15: value2 = count++;
16: printf("value2 = %d, count = %d\n", value2, count);
전위형
후위형
증감 연산자
연산자의 기본개념
18: count = 10;
19: ++count;
20: printf("count = %d\n", count);
21:22: count = 10;
23: count++;
24: printf("count = %d\n", count);
25:26: temperature++;
27: printf("temperature = %f\n", temperature);
28:29: return 0;
30: }
전위형
후위형
실수형에도 증감 연산자를 사용할 수 있다.
증감 연산자의 사용 예(2/2)
관계 연산자(1/2)
두 수의 값을 비교할 때 사용되는 연산자 수식의 값이 항상 참 또는 거짓이 된다.
관계 연산자
연산자의 종류
관계 연산자(2/2)
두 수의 값이 같은지 비교할 때는 = 연산자가 아니라 == 연산자를 사용해야 한 다.
관계 연산자
연산자의 종류
관계 연산자의 사용 예
관계 연산자
연산자의 종류
01: /* Ex04_04.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int a = 10;
07: int b = 20;
08:09: printf("a = %d, b = %d\n", a, b);
10: printf("a > b = %d\n", a > b);
11: printf("a >= b = %d\n", a >= b);
12: printf("a < b = %d\n", a < b);
13: printf("a <= b = %d\n", a <= b);
14: printf("a == b = %d\n", a == b);
15: printf("a != b = %d\n", a != b);
16:
관계 연산자
논리 연산자(1/2)
참과 거짓을 이용한 논리 연산 기능을 제공 AND(&&), OR(||), NOT(!) 연산
논리 연산자를 사용하지 않으면 잘못된 수식을 만들 수 있으므로 주의해야 한다.
논리 연산자
연산자의 종류
논리 연산자(2/2)
논리 연산자의 연산 결과
논리 연산자
연산자의 종류
논리 연산자의 사용 예
논리 연산자
연산자의 종류
01: /* Ex04_05.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int score = 95;
07:08: printf("90점 이상 100점 이하인가? : %d\n", 09: score >= 90 && score <= 100);
10:11: printf("0점 또는 100점인가? : %d\n", 12: score == 0 || score == 100);
13:
논리 연산자
논리 연산자
논리 연산자의 우선순위
논리 연산자는 관계 연산자보다 우선순위가 낮다.
&& 연산자가 || 연산자보다 우선순위가 높고, ! 연산자는 관계 연산자보다 우선순 위가 높다.
논리 연산자
연산자의 종류
비트 연산자
연산자의 종류
비트 AND 연산자(&)
각 비트 단위로 AND 연산을 수행
int a = 10;
int b = 12;
16진수와 2진수 변환
2진수는 0과 1만을 사용하고, 16진수는 0~9, A~F를 사용한다.
16진수를 2진수로 변환하려면, 16진수 1자리를 이진수 4자리로 나타내면 된다.
비트 연산자
연산자의 종류
비트 OR 연산자(|)
피연산자의 같은 위치에 있는 비트에 대해서 비트 OR 연산을 수행
비트 연산자
연산자의 종류
int a = 10;
int b = 12;
비트 XOR 연산자(^)
피연산자의 같은 위치에 있는 비트에 대해서 비트 XOR 연산을 수행
비트 연산자
연산자의 종류
int a = 10;
int b = 12;
int c = a ^ b;
비트 NOT 연산자(~)
피연산자의 각 비트를 반전시킨다. 즉, 0은 1로, 1은 0으로 만든다.
비트 연산자
연산자의 종류
int a = 10;
int c = ~a;
비트 연산자의 사용 예
비트 연산자
연산자의 종류
01: /* Ex04_06.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int a = 10; // 0x0a 07: int b = 12; // 0x0c
08: int c;
09:10: c = a & b;
11: printf("a & b = %08x(%d)\n", c, c);
12:13: c = a | b;
14: printf("a | b = %08x(%d)\n", c, c);
15:16: c = a ^ b;
17: printf("a ^ b = %08x(%d)\n", c, c);
18:
비트AND 연산자
비트OR 연산자
비트XOR 연산자
비트 이동 연산자(1/2)
비트 왼쪽 이동을 할 때는 왼쪽으로 밀려난 비트가 사라져 버리고, 오른쪽 빈자리 에는 0이 채워진다.
비트 왼쪽 이동은 2N을 곱하는 것이다.
비트 연산자
연산자의 종류
10 << 2
비트 이동 연산자(2/2)
비트 오른쪽 이동을 할 때는 오른쪽으로 밀려난 비트가 사라져 버리고, 왼쪽 빈자 리에는 부호 비트가 채워진다.
비트 오른쪽 이동은 2N으로 나누는 것이다.
비트 연산자
연산자의 종류
10 >> 2
비트 이동 연산자의 사용 예
비트 연산자
연산자의 종류
01: /* Ex04_07.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int a = 10; // 0x0a 07: int b;
08:09: b = a << 2;
10: printf("a << 2 = %08x(%d)\n", b, b);
11:12: b = a >> 2;
13: printf("a >> 2 = %08x(%d)\n", b, b);
비트 왼쪽 이동 연산자
비트 오른쪽 이동 연산자
대입 연산자(1/4)
대입 연산자(=)는 연산자의 좌변(변수)에 우변의 값을 저장한다.
대입 연산자의 좌변(l-value)에는 반드시 변수만 사용해야 한다.
대입 연산자
연산자의 종류
대입 연산자(2/4)
대입 연산을 수행하면, 대입 연산자의 좌변에 있는 l-value의 값이 연산의 결과가 된다.
대입 연산자
연산자의 종류
대입 연산자(3/4)
대입 연산자는 산술 연산자, 비트 연산자와 결합해서 복합 대입 연산자로 사용될 수 있다.
대입 연산자
연산자의 종류
대입 연산자(4/4)
복합 대입 연산자를 다른 연산자와 함께 사용할 때는 복합 대입 연산자는 다른 연 산자에 비해서 우선순위가 낮기 때문에 주의해야 한다.
대입 연산자
연산자의 종류
대입 연산자의 사용 예
대입 연산자
연산자의 종류
01: /* Ex04_08.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int num;
07:08: num = 5;
09: printf("num = %d\n", num);
10:11: num += 2;
12: printf("num = %d\n", num);
13:14: num *= 2;
15: printf("num = %d\n", num);
16:17: num |= 3;
18: printf("num = %d\n", num);
19:20: num <<= 2;
21: printf("num = %d\n", num);
대입 연산자
복합 대입 연산자
복합 대입 연산자
복합 대입 연산자
복합 대입 연산자
조건 연산자
유일한 삼항 연산자
조건 연산자
연산자의 종류
조건 연산자의 사용 예
조건 연산자
연산자의 종류
01: /* Ex04_09.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int a, b;
07: int min, max;
08:09: printf("두 개의 정수를 입력하세요 : ");
10: scanf("%d %d", &a, &b);
11:12: min = a < b ? a : b;
13: max = a > b ? a : b;
14:15: printf("min = %d, max = %d\n", min, max);
16:
조건 연산자
암시적인 형 변환
컴파일러에 의해서 자동으로 처리되는 형 변환 형 변환이 일어나는 경우
서로 다른 형의 값을 혼합 연산하는 경우
변수에 다른 형의 값을 대입할 때
형 변환 연산자
연산자의 종류
승진에 의한 자동 형 변환 예
형 변환 연산자
연산자의 종류
01: /* Ex04_10.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: short a = 500;
07: short b = 800;
08: short c;
09:10: printf("a * b = %d\n", a * b);
11:12: c = a * b;
13: printf("c = %d\n", c);
14:15: return 0;
16: }
승진에 의한 형변환
승진에 의한 형 변환
형 변환 연산자
연산자의 종류
대입 연산 시 형 변환 예
형 변환 연산자
연산자의 종류
01: /* Ex04_11.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int num;
07: double f;
08:09: num = 3.14;
10: printf("num = %d\n", num);
11:12: f = 123;
13: printf("f = %f\n", f);
14:15: return 0;
16: }
대입 연산 시 자동 형변환
대입 연산 시 자동 형변환
명시적인 형 변환(1/2)
프로그래머가 명시적으로 형 변환을 하고 싶을 때, 형 변환 연산자를 이용한다.
형 변환 연산자
연산자의 종류
명시적인 형 변환(2/2)
형 변환 연산자를 사용하면, 연산의 결과가 달라질 수 있으므로 주의해야 한다.
연산 전에 형 변환을 하는지, 연산 후에 형 변환을 하는지에 따라 연산의 결과가 달라질 수 있다.
형 변환 연산자
연산자의 종류
명시적인 형 변환 예(1/2)
형변환 연산자
연산자의 종류
01: /* Ex04_12.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int num;
07: float f;
08:09: f = 10 / 3;
10: printf("f = %f\n", f);
11:12: f = (float) 10 / 3;
13: printf("f = %f\n", f);
int / int로 처리
명시적인 형변환
명시적인 형 변환 예(2/2)
형변환 연산자
연산자의 종류
18: num = (int) (12.5 + 10.7);
19: printf("num = %d\n", num);
20:21: num = (int)12.5 + (int)10.7;
22: printf("num = %d\n", num);
23:24: return 0;
25: }
명시적인 형변환
명시적인 형변환
연산자의 우선순위(1/2)
단항 > 산술 > 관계 > 논리 > 대입 > 콤마 연산자
연산자의 우선순위
연산자의 우선순위와 결합 방향
우선순위 연산자 결합 방향
1 ( ) [ ] -> . →
2 ++ -- +(부호) -(부호) sizeof ~ ! * & (type) ←
3 * / % →
4 + - →
5 << >> →
6 < <= > >= →
7 == != →
8 & →
9 ^ →
10 | →
11 && →
연산자의 우선순위(2/2)
기본적인 연산자의 우선순위와는 다른 순서로 연산을 수행하려면 ( )를 사용한다.
연산자의 우선순위
연산자의 우선순위와 결합 방향
연산자의 결합 방향
같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지 여부
연산자의 결합 방향
연산자의 우선순위와 결합 방향
연산자의 우선순위와 결합 방향 예 연산자의 우선순위와 결합 방향
01: /* Ex04_13.c */
02: #include <stdio.h>
03:04: int main(void) 05: {
06: int a = 1, b = 2, c = 3;
07: int result;
08:09: result = a + b * c % 2;
10: printf("result = %d\n", result);
11:12: result = a > b || c > 0;
13: printf("result = %d\n", result);
14:15: result = a > b || c > 0 && b > c;
16: printf("result = %d\n", result);
17:18: result = ++a * b--;
19: printf("result = %d\n", result);
20:21: result = a = b = c;
연산자의 기본 개념
수식 : C 프로그램에서 값을 갖는 요소
연산자 : +, -, *, /처럼 연산에 사용되는 기호 피연산자 : 연산의 대상이 되는 값
학습정리
연산자의 종류
연산자의 우선 순위와 결합 방향
우선 순위
단항 > 산술 > 관계 > 논리 > 대입 > 콤마
결합 방향 : 같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지
학습정리
4장. 연산자
NEXTChapter 5장. 제어문
수고하셨습니다.
질문 있습니까?
6VPJ7-H3CXH-HBTPT-
X4T74-3YVY7
실습(1)
1. 다음과 같이 변수들이 정의되어 있는 경우, 각 변수에는 어떤 값이 저장되는
가?
int x=10, y=3, z=2;
(a) x+=y-=2 (b) x*=y+2 (c) z=x++ + ++y
2. a=3, b=5일때, 다음 각 수식의 실행 결과를 나타내시오.
(a)a<<2 (b)a & b (c)a || b (d)~a & b 3 다음 프로그램의 결과값을 구하세요.
int a=3, b=7, c=1;
int max;
max=(a>b) ? a : b; //두 수 중 큰 수를 구하는 방법
세 수중 가장 큰 수를 구하는 방법
int max, a, b, c;
printf(“세 수를 차례로 입력하세요>>> :");
scanf("%d %d %d", &a, &b, &c);
max=((a>b?a:b)>c) ? ((a>b)?a:b) : c ;
printf("가장 큰 수는 %d 입니다\n", max);
#define max(x,y) ((x>y) ? x : y)
int main(void){
int i, j, k;
printf(“세 정수를 입력하세요. ");
scanf("%d %d %d", &i, &j, &k);
printf("입력한 세 정수 중 가장 큰 수는%d입니다.\n", max(max(i,j),k));
⋇ 아래 ①~⑥에서까지 결과를 구하세요.
int a=10;
printf("%d\n", a++); //①출력값?
printf("%d\n", a); //②출력값?
a=10;
printf("%d\n", ++a); //③출력값?
printf("%d\n", a); //④출력값?
실습(2)
4. 3개의 정수를 입력 받아서 합계와 평균, 최대값과 최소값을 구해서 출력하는 프로그램을 작성하시오.(단, 평균은 소수점 이하까지 구하도록 한다)
5. 정수를 하나 입력 받아서, 그 정수에 2, 4, 8, 16, 32, 64, 128을 곱한 값을 각각 구해서 출력하는 프로그램을 작성하시오. (단, 곱을 구할 때 비트 이동연산자 를 이용한다.
6. 시간(시, 분, 초)을 입력받아 몇 초인지를 계산하는 프로그램을 작성하세요 .(ex.200초는 3분 20초이다, 3600초는 1시간이다)
-> printf(“시간을 입력하세요”), scanf(“%d”, &sec)
실습(3)
7. 연도를 입력받아서 윤년인지 아닌지를 확인하는 프로그램을 작성하세요
(윤년 : 4로 나누어 떨어지는 해는 윤년입니다.
4로 나누어 떨어지는 연도중에서 100으로 나누어 떨어진 연도는 윤년이 아닙니다.
400으로 나누어 떨어지는 연도는 윤년입니다.)
정수로 나누어 떨어지는지를 확인하려면 나머지 연산자 %를 이용한다.
scanf(“%d”, &year);
if( ) //조건을 만족시키면 printf(:%d년은 윤년입니다\n”, year); //현재 문장을 수행
else //위 조건이 만족되지 않으면 printf(:%d년은 윤년이 아닙니다\n”, year);//현재 문장을 수행