초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주
학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2
목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향 3
연산자의기본개념 수식 (expression) 값을갖는요소 연산식 : 연산자를이용해서만든수식 연산자 (operator) 연산에사용되는기호 피연산자 (operand) 연산의대상이되는값 4
피연산자의수에의한분류 기능에따른분류 의미연산자단항연산자피연산자한개 +, -, ++, --,!, &, ~, sizeof +, -, *, /, %, =, >, <, >=, <=, ==,!=, &&,, &,, ^, 이항연산자피연산자두개 <<, >>, +=, -=, *=, /=, %=, >>=, <<=, &=, =, ^= 삼항연산자피연산자세개?: 연산자 산술연산자 +, -, *, /, % 증감연산자 ++, -- 관계연산자 >, <, >=, <=, ==,!= 논리연산자 &&,,! 비트연산자 &,, ^, ~, <<, >> 대입연산자 =, +=, -=, *=, /=, %=, &=, =, ^=, >>=, <<= 조건연산자?: 그밖의연산자,( 콤마연산자 ), sizeof, 형변환연산자 5
연산자의기본개념 산술연산자 연산자 기능 사용예 연산의결과 + 더하기 5 + 2 7 - 빼기 5-2 3 * 곱하기 5 * 2 10 / 나누기 5 / 2 2 % 나머지구하기 5 % 2 1 6
연산자의기본개념 산술연산자의사용예 1: /* Ex04_01.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int num1, num2; 7: int result; 8: 9: printf(" 두개의정수를입력하세요 : "); 10: scanf("%d %d", &num1, &num2); 11: 7
산술연산자의사용예 연산자의기본개념 12: result = num1 + num2; 더하기 13: printf("%d + %d = %d\n", num1, num2, result); 14: 15: result = num1 - num2; 빼기 16: printf("%d - %d = %d\n", num1, num2, result); 17: 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: } 8
나누기연산자 (/) 정수 / 정수시소수점이하를버림 나머지연산자 (%) 정수형에대해서만사용가능 9
나머지연산자의사용예 1: /* Ex04_02.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int num; 7: int value; 8: 9: printf(" 정수를입력하세요 : "); 10: scanf("%d", &num); 11: 12: value = num % 256; 13: printf("value = %d\n", value); 14: 15: return 0; 16: } 나머지연산자사용 10
증감연산자 구분 증감연산자 연산의결과 전위형 ++num 증가된변수 num의값 --num 감소된변수 num의값 후위형 num++ 증가되기전변수 num의값 num-- 감소되기전변수 num의값 증감연산자는변수에만사용 11
증감연산자의사용예 연산자의기본개념 1: /* Ex04_03.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int num; 7: int n1, n2; 8: float pi = 3.14f; 9: 10: num = 10; 11: n1 = ++num; 12: printf("n1 = %d, num = %d\n", n1, num); 13: 14: num = 10; 15: n2 = num++; 전위형 후위형 16: printf("n2 = %d, num = %d\n", n2, num); 17: 12
증감연산자의사용예 18: num = 10; 19: ++num; 연산자의기본개념 20: printf("num = %d\n", num); 21: 22: num = 10; 23: num++; 전위형 후위형 24: printf("num = %d\n", num); 25: 26: pi++; 27: printf("pi = %f\n", pi); 28: 29: return 0; 30: } 13
관계연산자를포함한수식의값은항상참또는거짓 값이같은지비교 : == 연산자 관계연산자 연산자의의미 연산의결과 a > b a가 b보다큰가? 0 a >= b a가 b보다크거나같은가? 0 a < b a가 b보다작은가? 1 a <= b a가 b보다작거나같은가? 1 a == b a가 b와같은가? 0 a!= b a가 b와다른가? 1 14
관계연산자의사용예 1: /* Ex04_04.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int a = 10; 7: int b = 20; 8: 9: 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: 17: return 0; 18: } 관계연산자 15
논리연산자 a b a && b a b! a 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 논리연산자를사용하지않은경우 논리연산자를사용하는경우 16
논리연산자의사용예 1: /* Ex04_05.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int grade = 95; 7: 8: printf("grade >= 90 && grade < 100 의값 : %d\n", grade >= 90 && grade <= 100); 10: 11: printf("grade < 0 grade == 100 의값 : %d\n", grade < 0 grade == 100); 13: 14: printf("!grade 값 : %d\n",!grade); 15: 16: return 0; 17: } 17
비트 AND 연산자 (&) a 의비트 b 의비트 a 의비트 & b 의비트 0 0 0 0 1 0 1 0 0 1 1 1 18
16 진수와 2 진수 16진수 2진수 16진수 2진수 16진수 2진수 16진수 2진수 0 0 0000 0 4 0100 0 8 1000 0 c 1100 0 1 0001 0 5 0101 0 9 1001 0 d 1101 0 2 0010 0 6 0110 0 a 1010 0 e 1110 0 3 0011 0 7 0111 0 b 1011 0 f 1111 19
비트 OR 연산자 ( ) a의비트 b의비트 a의비트 b의비트 0 0 0 0 1 1 1 0 1 1 1 1 20
비트 XOR 연산자 (^) a의비트 b의비트 a의비트 ^ b의비트 0 0 0 0 1 1 1 0 1 1 1 0 21
비트 NOT 연산자 (~) a의비트 ~a의비트 0 1 1 0 22
비트연산자의사용예 1: /* Ex04_06.c */ 2: #include <stdio.h> 4: int main(void) 5: { 6: int a = 10; // 0x0a 7: int b = 12; // 0x0c 8: int c; 10: c = a & b; 비트 AND 연산자 11: printf("a & b = %08x(%d)\n", c, c); 13: c = a b; 비트 OR 연산자 14: printf("a b = %08x(%d)\n", c, c); 16: c = a ^ b; 비트 XOR 연산자 17: printf("a ^ b = %08x(%d)\n", c, c); 19: c = ~a; 20: printf("~a = %08x(%d)\n", c, c); 비트 NOT 연산자 22: return 0; 23: } 23
비트이동연산자 (<<, >>) 10 << 2 10 >> 2 24
비트이동연산자의사용예 1: /* Ex04_07.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int a = 10; // 0x0a 7: int b; 8: 9: 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); 14: 15: return 0; 16: } 비트왼쪽이동연산자 비트오른쪽이동연산자 25
대입연산자 좌변에있는변수 (l-value) 에우변에있는수식의값 (r-value) 을저장 l-value 에는반드시변수만사용 26
복합대입연산자 복합대입연산자연산자의의미 a += b a = a + b a -= b a = a - b a *= b a = a * b a /= b a = a / b a %= b a = a % b a &= b a = a & b a = b a = a b a ^= b a = a ^ b a <<= b a = a << b a >>= b a = a >> b 우선순위가낮기때문에다른연산자와혼합해서사용할때주의 27
비트이동연산자의사용예 1: /* Ex04_08.c */ 2: #include <stdio.h> 4: int main(void) 5: { 6: int num; 8: num = 5; 9: printf("num = %d\n", num); 11: num += 2; 12: printf("num = %d\n", num); 14: num *= 2; 15: printf("num = %d\n", num); 17: num = 3; 18: printf("num = %d\n", num); 20: num <<= 2; 21: printf("num = %d\n", num); 23: return 0; 24: } 대입연산자복합대입연산자복합대입연산자복합대입연산자복합대입연산자 28
조건연산자 조건연산자는유일한삼항연산자 29
조건연산자의사용예 1: /* Ex04_09.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int a, b; 7: int min, max; 8: 9: 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: 17: return 0; 18: } 30
암시적인형변환 컴파일러에의해서자동으로처리되는형변환 형변환이일어나는경우 서로다른형의값을혼합연산하는경우 변수에다른형의값을대입할때 31
승진에의한자동형변환예 1: /* Ex04_10.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: short a = 500; 7: short b = 800; 8: short c; 9: 10: printf("a * b = %d\n", a * b); 11: 12: c = a * b; 13: printf("c = %d\n", c); 14: 15: return 0; 16: } 승진에의한형변환 32
승진에의한형변환 33
대입연산시형변환 1: /* Ex04_11.c */ 2: #include <stdio.h> 3: 4: int main(void) 5: { 6: int num; 7: double f; 8: 9: num = 3.14; 10: printf("num = %d\n", num); 11: 12: f = 123; 13: printf("f = %f\n", f); 14: 15: return 0; 16: } 대입연산시자동형변환 대입연산시자동형변환 34
명시적인형변환 35
명시적인형변환 1: /* Ex04_12.c */ 2: #include <stdio.h> 4: int main(void) 5: { 6: int num; 7: float f; 8: 9: f = 10 / 3; 10: printf("f = %f\n", f); 11: 12: f = (float) 10 / 3; 13: printf("f = %f\n", f); 14: 15: f = (float) 10 / (float) 3; 16: printf("f = %f\n", f); 17: int / int 로처리 명시적인형변환 명시적인형변환 36
명시적인형변환 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: } 명시적인형변환 명시적인형변환 37
연산자의우선순위와결합방향 일반적인연산자의우선순위 단항 > 산술 > 관계 > 논리 > 대입 > 콤마연산자의순 우선순위 연산자 결합방향 1 ( ) [ ] ->. 2 ++ -- +( 부호 ) -( 부호 ) sizeof ~! * & (type) 3 * / % 4 + - 5 << >> 6 < <= > >= 7 ==!= 8 & 9 ^ 10 11 && 12 13?: 14 = += -= *= /= %= &= = ^= <<= >>= 15,( 콤마 ) 38
연산자의우선순위와결합방향 연산자의우선순위변경 39
연산자의우선순위와결합방향 1: /* Ex04_13.c */ 2: #include <stdio.h> 4: int main(void) 5: { 6: int a = 1, b = 2, c = 3; 7: int result; 9: result = a + b * c % 2; 10: printf("result = %d\n", result); 12: result = a > b c > 0; 13: printf("result = %d\n", result); 15: result = a > b c > 0 && b > c; 16: printf("result = %d\n", result); 18: result = ++a * b--; 19: printf("result = %d\n", result); 21: result = a = b = c; 22: printf("result = %d\n", result); 24: return 0; 25: } 40
연산자의우선순위와결합방향 연산자의결합방향 41
학습정리 연산자의기본개념 수식 : C 프로그램에서값을갖는요소 연산자 : +, -, *, / 처럼연산에사용되는기호 피연산자 : 연산의대상이되는값 연산자산술연산자 +, -, *, /, % 증감연산자 ++, -- 관계연산자 >, <, >=, <=, ==,!= 논리연산자 &&,,! 비트연산자 &,, ^, ~, <<, >> 대입연산자 =, +=, -=, *=, /=, %=, &=, =, ^=, >>=, <<= 조건연산자?: 그밖의연산자,( 콤마연산자 ), sizeof, 형변환연산자 42