int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); } 1 학습목표 수식의 개념과 연산자, 피연산자에 대해서 알아본다. C의 를 알아본다. 연산자의 우선 순위와 결합 방향에 대하여 알아본다. 2
목차 연산자의 기본 개념 수식 연산자와 피연산자 산술 연산자 / 증감 연산자 관계 연산자 / 논리 연산자 비트 연산자 / 대입 연산자 조건 연산자 / 형변환 연산자 연산자의 우선순위와 결합 방향 연산자의 우선순위 연산자의 결합 방향 3 연산자의 기본개념 수식 수식(expression) 값을 갖는 요소 수식의 값을 구하는 것을 수식을 평가한다 고 한다. 연산식 : 연산자를 이용한 수식 연산자(operator)와 하나 이상의 피연산자(operand)로 구성 4
연산자의 기본개념 연산자와 피연산자 연산자 연산에 사용되는 기호 +, -, ++, --, ==, >, <, &&,, <<, >> 등 피연산자 연산의 대상이 되는 값 5 연산자의 기본개념 연산자와 피연산자 (1/2) 피연산자의 개수에 따른 6
연산자의 기본개념 연산자와 피연산자 (2/2) 연산자의 기능에 따른 7 산술 연산자 산술 연산자 기본적인 사칙 연산 기능을 제공하는 연산자 8
산술 연산자 산술 연산자의 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex04_01.c */ int num1, num2; int result; printf("두 개의 정수를 입력하세요 : "); scanf("%d %d", &num1, &num2); 더하기 result = num1 + num2; printf("%d + %d = %d\n", num1, num2, result); 빼기 result = num1 - num2; printf("%d - %d = %d\n", num1, num2, result); 9 산술 연산자 산술 연산자의 사용 예(2/2) 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: } 곱하기 result = num1 * num2; printf("%d * %d = %d\n", num1, num2, result); 나누기 result = num1/ num2; printf("%d / %d = %d\n", num1, num2, result); 나머지 result = num1 % num2; printf("%d %% %d = %d\n", num1, num2, result); 10
산술 연산자 나누기 연산자(/) 정수에 대하여 나누기 연산자(/)를 사용하면, 소수점 이하는 버리고(truncation) 몫을 정수로만 구한다. 나머지 연산자(%) 정수형에 대해서만 사용 가능 11 산술 연산자 나머지 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex04_02.c */ int num; int thousands, tens; printf("6자리 정수를 입력하세요 : "); scanf("%d", &num); thousands = num / 1000; 나머지 연산자 사용 tens = num % 1000; printf("%d,%d\n", thousands, tens); } 12
증감 연산자 증감 연산자 변수의 값을 1만큼 증가시키거나 감소시킨다. 증감 연산자는 반드시 변수에만 사용해야 한다. 전위형과 후위형 13 연산자의 기본개념 증감 연산자 증감 연산자의 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex04_03.c */ int count; int value1, value2; float temperature = 10.5f; count = 10; value1 = ++count; 전위형 printf("value1 = %d, count = %d\n", value1, count); count = 10; value2 = count++; 후위형 printf("value2 = %d, count = %d\n", value2, count); 14
연산자의 기본개념 증감 연산자 증감 연산자의 사용 예(2/2) 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: } count = 10; 전위형 ++count; printf("count = %d\n", count); count = 10; 후위형 count++; printf("count = %d\n", count); temperature++; 실수형에도 증감 연산자를 사용할 수 있다. printf("temperature = %f\n", temperature); 15 관계 연산자 관계 연산자(1/2) 두 수의 값을 비교할 때 사용되는 연산자 수식의 값이 항상 참 또는 거짓이 된다. 16
관계 연산자 관계 연산자(2/2) 두 수의 값이 같은지 비교할 때는 = 연산자가 아니라 == 연산자를 사용해야 한 다. 17 관계 연산자 관계 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* Ex04_04.c */ int a = 10; int b = 20; printf("a printf("a printf("a printf("a printf("a printf("a printf("a } = %d, b = %d\n", a, b); > b = %d\n", a > b); >= b = %d\n", a >= b); < b = %d\n", a < b); <= b = %d\n", a <= b); == b = %d\n", a == b);!= b = %d\n", a!= b); 관계 연산자 18
논리 연산자 논리 연산자(1/2) 참과 거짓을 이용한 논리 연산 기능을 제공 AND(&&), OR( ), NOT(!) 연산 논리 연산자를 사용하지 않으면 잘못된 수식을 만들 수 있으므로 주의해야 한다. 19 20 논리 연산자 논리 연산자(2/2) 논리 연산자의 연산 결과
논리 연산자 논리 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 16: 17: /* Ex04_05.c */ int score = 95; } printf("90점 이상 100점 이하인가? : %d\n", score >= 90 && score <= 100); 논리 연산자 printf("0점 또는 100점인가? : %d\n", score == 0 score == 100); 논리 연산자 printf("0점인가? : %d\n",!score); 논리 연산자 21 논리 연산자 논리 연산자의 우선순위 논리 연산자는 관계 연산자보다 우선순위가 낮다. && 연산자가 연산자보다 우선순위가 높고,! 연산자는 관계 연산자보다 우선순 위가 높다. 22
비트 연산자 비트 AND 연산자(&) 각 비트 단위로 AND 연산을 수행 int a = 10; int b = 12; int c = a & b; 23 비트 연산자 16진수와 2진수 변환 2진수는 0과 1만을 사용하고, 16진수는 0~9, A~F를 사용한다. 16진수를 2진수로 변환하려면, 16진수 1자리를 이진수 4자리로 나타내면 된다. 24
비트 연산자 비트 OR 연산자( ) 피연산자의 같은 위치에 있는 비트에 대해서 비트 OR 연산을 수행 int a = 10; int b = 12; int c = a b; 25 비트 연산자 비트 XOR 연산자(^) 피연산자의 같은 위치에 있는 비트에 대해서 비트 XOR 연산을 수행 int a = 10; int b = 12; int c = a ^ b; 26
비트 연산자 비트 NOT 연산자(~) 피연산자의 각 비트를 반전시킨다. 즉, 0은 1로, 1은 0으로 만든다. int a = 10; int c = ~a; 27 비트 연산자 비트 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: /* Ex04_06.c */ int a = 10; // 0x0a int b = 12; // 0x0c int c; } c = a & b; printf("a & b = %08x(%d)\n", c, c); 비트 AND 연산자 c = a b; printf("a b = %08x(%d)\n", c, c); 비트 OR 연산자 c = a ^ b; printf("a ^ b = %08x(%d)\n", c, c); 비트 XOR 연산자 c = ~a; printf("~a = %08x(%d)\n", c, c); 비트 NOT 연산자 28
비트 연산자 비트 이동 연산자(1/2) 비트 왼쪽 이동을 할 때는 왼쪽으로 밀려난 비트가 사라져 버리고, 오른쪽 빈자리 에는 0이 채워진다. 비트 왼쪽 이동은 2N을 곱하는 것이다. 10 << 2 29 비트 연산자 비트 이동 연산자(2/2) 비트 오른쪽 이동을 할 때는 오른쪽으로 밀려난 비트가 사라져 버리고, 왼쪽 빈자 리에는 부호 비트가 채워진다. 비트 오른쪽 이동은 2N으로 나누는 것이다. 10 >> 2 30
비트 연산자 비트 이동 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex04_07.c */ int a = 10; // 0x0a int b; b = a << 2; 비트 왼쪽 이동 연산자 printf("a << 2 = %08x(%d)\n", b, b); b = a >> 2; 비트 오른쪽 이동 연산자 printf("a >> 2 = %08x(%d)\n", b, b); } 31 대입 연산자 대입 연산자(1/4) 대입 연산자(=)는 연산자의 좌변(변수)에 우변의 값을 저장한다. 대입 연산자의 좌변(l-value)에는 반드시 변수만 사용해야 한다. 32
대입 연산자 대입 연산자(2/4) 대입 연산을 수행하면, 대입 연산자의 좌변에 있는 l-value의 값이 연산의 결과가 된다. 33 대입 연산자 대입 연산자(3/4) 대입 연산자는 산술 연산자, 비트 연산자와 결합해서 복합 대입 연산자로 사용될 수 있다. 34
대입 연산자 대입 연산자(4/4) 복합 대입 연산자를 다른 연산자와 함께 사용할 때는 복합 대입 연산자는 다른 연 산자에 비해서 우선순위가 낮기 때문에 주의해야 한다. 35 대입 연산자 대입 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: /* Ex04_08.c */ int num; 대입 연산자 num = 5; printf("num = %d\n", num); 복합 대입 연산자 num += 2; printf("num = %d\n", num); num *= 2; 복합 대입 연산자 printf("num = %d\n", num); num = 3; 복합 대입 연산자 printf("num = %d\n", num); num <<= 2; 복합 대입 연산자 printf("num = %d\n", num); } 36
조건 연산자 조건 연산자 유일한 삼항 연산자 37 조건 연산자 조건 연산자의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* Ex04_09.c */ int a, b; int min, max; printf("두 개의 정수를 입력하세요 : "); scanf("%d %d", &a, &b); min = a < b? a : b; max = a > b? a : b; 조건 연산자 printf("min = %d, max = %d\n", min, max); } 38
형 변환 연산자 암시적인 형 변환(Implicit Type Casting) 컴파일러에 의해서 자동으로 처리되는 형 변환 형 변환이 일어나는 경우 서로 다른 형의 값을 혼합 연산하는 경우 변수에 다른 형의 값을 대입할 때 39 형 변환 연산자 승진에 의한 자동 형 변환 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex04_10.c */ short a = 500; short b = 800; short c; printf("a * b = %d\n", a * b); 승진에 의한 형변환 c = a * b; printf("c = %d\n", c); } 40
형 변환 연산자 승진에 의한 형 변환 41 형 변환 연산자 대입 연산 시 형 변환 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex04_11.c */ int num; double f; num = 3.14; 대입 연산 시 자동 형변환 printf("num = %d\n", num); f = 123; printf("f = %f\n", f); } 대입 연산 시 자동 형변환 42
형 변환 연산자 명시적인 형 변환(Explicit Type Casting)(1/2) 프로그래머가 명시적으로 형 변환을 하고 싶을 때, 형 변환 연산자를 이용한다. 43 형 변환 연산자 명시적인 형 변환(2/2) 형 변환 연산자를 사용하면, 연산의 결과가 달라질 수 있으므로 주의해야 한다. 연산 전에 형 변환을 하는지, 연산 후에 형 변환을 하는지에 따라 연산의 결과가 달라질 수 있다. 44
형변환 연산자 명시적인 형 변환 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex04_12.c */ int num; float f; f = 10 / 3; printf("f = %f\n", f); int / int로 처리 f = (float) 10 / 3; printf("f = %f\n", f); 명시적인 형변환 f = (float) 10 / (float) 3; printf("f = %f\n", f); 명시적인 형변환 45 형변환 연산자 명시적인 형 변환 예(2/2) 18: 19: 20: 21: 22: 23: 24: 25: } num = (int) (12.5 + 10.7); printf("num = %d\n", num); num = (int)12.5 + (int)10.7; printf("num = %d\n", num); 명시적인 형변환 명시적인 형변환 46
연산자의 우선순위와 결합 방향 연산자의 우선순위 연산자의 우선순위(1/2) 단항 > 산술 > 관계 > 논리 > 대입 > 콤마 연산자 우선순위 연산자 결합 방향 1 ( ) [ ] ->. 2 ++ -- +(부호) -(부호) sizeof ~! * & (type) 3 */% 4 +- 5 << >> 6 < <= > >= 7 ==!= 8 & 9 ^ 10 11 && 12 13?: 14 = += -= *= /= %= &= = ^= <<= >>= 15,(콤마) 47 연산자의 우선순위와 결합 방향 연산자의 우선순위 연산자의 우선순위(2/2) 기본적인 연산자의 우선순위와는 다른 순서로 연산을 수행하려면 ( )를 사용한다. 48
연산자의 우선순위와 결합 방향 연산자의 결합 방향 연산자의 결합 방향 같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지 여부 49 연산자의 우선순위와 결합 방향 연산자의 우선순위와 결합 방향 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: /* Ex04_13.c */ int a = 1, b = 2, c = 3; int result; result = a + b * c % 2; printf("result = %d\n", result); result = a > b c > 0; printf("result = %d\n", result); result = a > b c > 0 && b > c; printf("result = %d\n", result); result = ++a * b--; printf("result = %d\n", result); result = a = b = c; printf("result = %d\n", result); } 50
학습정리 연산자의 기본 개념 수식 : C 프로그램에서 값을 갖는 요소 연산자 : +, -, *, /처럼 연산에 사용되는 기호 피연산자 : 연산의 대상이 되는 값 51 학습정리 연산자의 우선 순위와 결합 방향 우선 순위 단항 > 산술 > 관계 > 논리 > 대입 > 콤마 결합 방향 : 같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지 52
4 장. 연산자 수고하셨습니다. 질문있습니까? NEXT Chapter 5 장. 제어문 53