Chapter 04 C 연산자의 이해
산술 연산자 관계 연산자 논리 연산자 비트 연산자 연산자 우선순위
1. 산술 연산자 기본 산술 연산자
[기본 4-1] 산술 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a, b = 5 , c = 3; 06 07 a = b + c; 08 printf(" %d + %d = %d \n", b, c, a); 09 10 a = b - c; 11 printf(" %d - %d = %d \n", b, c, a); 12 13 a = b * c; 14 printf(" %d * %d = %d \n", b, c, a); 15 16 a = b / c; 17 printf(" %d / %d = %d \n", b, c, a); 18 19 a = b % c; 20 printf(" %d %% %d = %d \n", b, c, a); 21 } ---더하기로 연산해서 a에 대입한다. ---빼기로 연산해서 a에 대입한다. ---곱하기로 연산해서 a에 대입한다. ---나누기로 연산해서 a에 대입한다. ---나머지로 연산해서 a에 대입한다.
1. 산술 연산자 연산자 우선순위와 강제 형 변환 연산자 우선 순위 괄호 > 곱셈, 나눗셈 > 덧셈, 뺄셈 1. 산술 연산자 연산자 우선순위와 강제 형 변환 연산자 우선 순위 괄호 > 곱셈, 나눗셈 > 덧셈, 뺄셈 연산자가 모두 동일한 경우에는 왼쪽에서 오른쪽으로 계산 진행.
[응용 4-2] 연산자 우선순위와 강제 형 변환 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 2 , b = 3 , c = 4; 06 int result1, mok, namugi; 07 float result2; 08 09 result1 = a + b - c; 10 printf(" %d + %d - %d = %d \n", a, b, c, result1); 11 12 result1 = a + b * c; 13 printf(" %d + %d * %d = %d \n", a, b, c, result1); 14 15 result2 = a * b / (float) c; 16 printf(" %d * %d / %d = %f \n", a, b, c, result2); 17 18 ___①__ = c / b; 19 printf(" %d / %d 의 몫은 %d \n", c, b, mok); 20 21 ___②__ = c % b; 22 printf(" %d / %d 의 나머지는 %d \n", c, b, namugi); 23 } ---정수형 변수를 선언한다. ---실수형 변수를 선언한다. ---더하기와 빼기 연산을 동시에 수행한다. ---더하기와 곱하기 연산을 동시에 수행한다 ---정수 c를 실수로 강제로 형 변환한 후에 연산한다 ---몫을 구한다. ---나머지를 구한다.
1. 산술 연산자 간단한 연산자 우선순위 덧셈 뺄셈은 연산자 우선순위가 동일 하므로 아래 결과는 같다. 1. 산술 연산자 간단한 연산자 우선순위 덧셈 뺄셈은 연산자 우선순위가 동일 하므로 아래 결과는 같다. 연산자 우선순위에 의해 12행의 결과는 아래의 ➋ 가 나옴. ( * 이 + 보다 우선순위가 높음)
1. 산술 연산자 데이터 형식의 강제 형 변환 15행에서 형 변환을 하지 않았을 경우
1. 산술 연산자 15행에서 강제 형 변환을 할 경우 강제 형 변환을 하려면 변수 또는 상수 앞에 ‘(형식 이름)’을 써줌.
1. 산술 연산자 대입 연산자와 증감 연산자 대입 연산자 : =, +=, -=, *=, /=, %= 1. 산술 연산자 대입 연산자와 증감 연산자 대입 연산자 : =, +=, -=, *=, /=, %= 증감 연산자 : ++, --
[기본 4-3] 대입 연산자와 증감 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 10; 06 07 a++; 08 printf ( " a ++ = => %d \n", a); 09 10 a--; 11 printf ( " a - - = => %d \n", a); 12 13 a += 5; 14 printf ( " a += 5 = = > %d \n", a); 15 16 a -= 5; 17 printf ( " a -= 5 = = > %d \n", a); 18 19 a *= 5; 20 printf ( " a *= 5 = = > %d \n", a); 21 ---a = a + 1과 동일하다. ---a = a - 1과 동일하다. ---a = a + 5와 동일하다. ---a = a - 5와 동일하다. ---a = a * 5와 동일하다.
[기본 4-3] 대입 연산자와 증감 연산자 사용 예 22 a /= 5; 23 printf ( " a /= 5 = = > %d \n", a); 24 25 a %= 5; 26 printf ( " a %%= 5 = = > %d \n", a); 27 } ---a = a / 5와 동일하다. ---a = a % 5와 동일하다.
[응용 4-4] 증감 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 10, b; 06 07 b = a++; 08 printf (" %d \n", b); 09 10 ___①___ 11 printf (" %d \n", b); 12 } --- b = a를 수행한 후 a를 1 증가시킨다. --- a를 1 증가시킨 후에 b =a 를 수행한다.
1. 산술 연산자 a++와 ++a의 차이 7행과 10행
2. 관계 연산자 관계 연산자의 기본 개념 비교 연산자 – 어떤 것이 큰지, 작은지, 같은지 비교. 2. 관계 연산자 관계 연산자의 기본 개념 비교 연산자 – 어떤 것이 큰지, 작은지, 같은지 비교. 결과는 참(1, True)이나 거짓(0, False) 주로 조건 식에 사용, 단독으로는 쓰이지 않음.
[기본 4-5] 관계 연산자의 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 100 , b = 200; 06 07 printf(" %d = = %d 는 %d 이다.\n", a, b, a= =b); 08 printf(" %d != %d 는 %d 이다.\n", a, b, a!=b); 09 printf(" %d > %d 는 %d 이다.\n",a, b, a>b); 10 printf(" %d < %d 는 %d 이다.\n",a, b, a<b); 11 printf(" %d >= %d 는 %d 이다.\n", a, b, a>=b); 12 printf(" %d <= %d 는 %d 이다.\n", a, b, a<=b); 13 14 printf(" %d = %d 는 %d 이다.\n", a, b, a=b); 15 } ---관계 연산자 '같다' ---관계 연산자 '같지 않다 ---관계 연산자 '같지 않다 ---관계 연산자 '작다' ---관계 연산자 '크거나 같다' ---관계 연산자 '작거나 같다 ---관계 연산자가 아닌 대입 연산자를 사용했다.
2. 관계 연산자 대입 연산자의 작동 14행 ‘==’ 연산자 대신 ‘=’ 연산자를 사용한 결과 2. 관계 연산자 대입 연산자의 작동 14행 ‘==’ 연산자 대신 ‘=’ 연산자를 사용한 결과 == : 값이 같은지 체크하는 연산자 = : 오른쪽의 값을 왼쪽에 대입하는 연산자
3. 논리 연산자 논리 연산자의 기본개념 여러 조건을 복합하여 사용 && (그리고), || (또는), ! (부정) 3. 논리 연산자 논리 연산자의 기본개념 여러 조건을 복합하여 사용 && (그리고), || (또는), ! (부정) 논리 연산자의 종류 참이 되려면 두 조건이 모두 참이어야 함
[기본 4-6] 논리 연산자 사용 예 ① 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 99; 06 07 printf(" AND 연산 : %d \n", (a >= 100) && (a <= 200) ); 08 printf(" OR 연산 : %d \n", (a >= 100) || (a <= 200) ); 09 printf(" NOT 연산 : %d \n", !(a= =100) ); 10 } ---AND 연산을 사용한다. ---OR 연산을 사용한다. ---NOT 연산을 사용한다.
[응용 4-7] 논리 연산자 사용 예 ② 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 100, b = -200; 06 07 printf(" 상수의 AND 연산 : %d \n", a && b ); 08 printf(" 상수의 OR 연산 : %d \n", ___①___); 09 printf(" 상수의 NOT 연산 : %d \n", ___②___); 10 } ---AND 연산을 사용한다. ---OR 연산을 사용한다. ---NOT 연산을 사용한다.
4. 비트 연산자 비트 연산자 비트 연산자는 정수나 문자 등을 2진수로 변환한 후에 각 자리의 비트끼리 연산을 수행한다. 4. 비트 연산자 비트 연산자 비트 연산자는 정수나 문자 등을 2진수로 변환한 후에 각 자리의 비트끼리 연산을 수행한다. 비트 연산자의 종류
4. 비트 연산자 비트 논리곱(&) 연산자 10진수를 2진수로 변환한 후 각 비트에 AND 연산 수행 4. 비트 연산자 비트 논리곱(&) 연산자 10진수를 2진수로 변환한 후 각 비트에 AND 연산 수행 결과 : 2진수로는 00102 , 10진수로는 2
[기본 4-8] 비트 논리곱 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 printf(" 10 & 7 = %d \n", 10 & 7 ); 06 printf(" 123 & 456 = %d \n", 123 & 456 ); 07 printf(" 0xFFFF & 0000 = %d \n ", 0xFFFF & 0000 ); 08 } ---10과 7의 비트 논리곱을 수행한다. ---123과 456의 비트 논리곱을 수행한다. ---16진수 FFFF와 0의 비트 논리곱을 수행한다.
4. 비트 연산자 비트 논리합(|) 연산자 10진수를 2진수로 변환한 후 각 비트에 OR 연산 수행 4. 비트 연산자 비트 논리합(|) 연산자 10진수를 2진수로 변환한 후 각 비트에 OR 연산 수행 결과 : 2진수로는 11112 , 10진수로는 15
[기본 4-9] 비트 논리합 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 printf(" 10 | 7 = %d \n", 10 | 7 ); 06 printf(" 123 | 456 = %d \n", 123 | 456 ); 07 printf(" 0xFFFF | 0000 = %d \n ", 0xFFFF | 0000 ); 08 } ---10과 7의 비트 논리합을 수행한다. ---123과 456의 비트 논리합을 수행한다. ---16진수 FFFF와 0의 비트 논리합을 수행한다.
4. 비트 연산자 비트 배타적 논리합(^) 연산자 두 값이 다르면 참(1), 같으면 거짓(0) 4. 비트 연산자 비트 배타적 논리합(^) 연산자 두 값이 다르면 참(1), 같으면 거짓(0) ‘참(1) ^ 참(1)’이나 ‘거짓(0) ^거짓(0)’이면 결과는 거짓(0)이고, ‘참(1) ^ 거짓(0)’이나 ‘거짓(0) ^ 참(1)’이면 그 결과는 참(1). 결과 : 2진수로는 11012 , 10진수로는 13
[기본 4-10] 비트 배타적 논리합 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 printf(" 10 ^ 7 = %d \n", 10 ^ 7 ); 06 printf(" 123 ^ 456 = %d \n", 123 ^ 456 ); 07 printf(" 0xFFFF ^ 0000 = %d \n ", 0xFFFF ^ 0000 ); 08 } ---10과 7의 비트 배타적 논리합을 수행한다. ---123과 456의 비트 배타적 논리합을 수행한다. ---16진수 FFFF와 0의 비트 배타적 논리합을 수행한다
[응용 4-11] 비트 연산에 마스크를 사용한 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 char a = 'A', b, c; 06 char mask = 0x0F; 07 08 printf(" %X & %X = %X \n", a, mask, a & mask); 09 printf(" %X | %X = %X \n", a, mask, a | mask); 10 11 mask = 'a' - 'A'; 12 13 b = ___①____ 14 printf(" %c ^ %d = %c \n", a, mask, b); 15 a = ___②____ 16 printf(" %c ^ %d = %c \n", b, mask, a); 17 } ---마스크 값(0000 11112)을 설정한다. ---'A'와 0x0F의 논리곱을 수행한다. ---'A'와 0x0F의 논리합을 수행한다. ---'a'와 'A'의 차이는 32다. ---'A'와 마스크(32)의 배타적 논리곱을 수행한다. ---'a'와 마스크(32)의 배타적 논리곱을 수행한다.
4. 비트 연산자 마스크(mask)를 사용한 비트 연산 6행 : 마스크 값 선언 : 16진수 0x0F16 4. 비트 연산자 마스크(mask)를 사용한 비트 연산 6행 : 마스크 값 선언 : 16진수 0x0F16 8행 : 마스크를 사용한 비트 논리곱 결과
4. 비트 연산자 9행 : 마스크를 사용한 비트 논리합 결과 11행 : 마스크 값 선언 4. 비트 연산자 9행 : 마스크를 사용한 비트 논리합 결과 11행 : 마스크 값 선언 13행, 15행 : 마스크를 사용하여 ‘a’, ‘A’의 비트 배타적 논리합 수행
4. 비트 연산자 비트 부정(~) 연산자 두 수에 대한 연산이 아니라 비트 하나의 값을 반대로 만듦 1의 보수 4. 비트 연산자 비트 부정(~) 연산자 두 수에 대한 연산이 아니라 비트 하나의 값을 반대로 만듦 1의 보수 0 1로 , 1 0으로 해당 값의 음수(-) 값을 찾을 때 사용 2의 보수(음수) = { 1의 보수(각 비트의 값을 반전시킨 값) } + 1
[기본 4-12] 비트 부정 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 12345; 06 07 printf(" %d \n", ~a + 1); 08 } ---2의 보수(a값)를 구한다.
4. 비트 연산자 비트 왼쪽 시프트(<<) 연산자 나열된 비트를 왼쪽으로 이동시키는 연산자 4. 비트 연산자 비트 왼쪽 시프트(<<) 연산자 나열된 비트를 왼쪽으로 이동시키는 연산자 시프트 할 때마다 2n(21, 22, 23…)을 곱한 효과 2610 의 왼쪽 시프트 연산 예 0000 11012 로 변환한 후 비트 이동
[기본 4-13] 비트 왼쪽 시프트 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 10; 06 printf ("%d 를 왼쪽 1회 시프트하면 %d 이다.\n", a, a<<1); 07 printf ("%d 를 왼쪽 2회 시프트하면 %d 이다.\n", a, a<<2); 08 printf ("%d 를 왼쪽 3회 시프트하면 %d 이다.\n", a, a<<3); 09 } ---왼쪽으로 시프트 한 결과를 출력한다.
4. 비트 연산자 비트 오른쪽 시프트(>>) 연산자 나열된 비트를 오른쪽으로 이동시키는 연산자 4. 비트 연산자 비트 오른쪽 시프트(>>) 연산자 나열된 비트를 오른쪽으로 이동시키는 연산자 시프트할 때마다 2n(21, 22, 23…)으로 나눈 효과 2610 의 오른쪽 시프트 연산 예
[기본 4-14] 비트 오른쪽 시프트 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 10; 06 printf ("%d 를 오른쪽 1회 시프트하면 %d 이다.\n", a, a>>1); 07 printf ("%d 를 오른쪽 2회 시프트하면 %d 이다.\n", a, a>>2); 08 printf ("%d 를 오른쪽 3회 시프트하면 %d 이다.\n", a, a>>3); 09 printf ("%d 를 오른쪽 4회 시프트하면 %d 이다.\n", a, a>>4); 10 } ---오른쪽으로 시프트 한 결과를 출력한다.
[응용4-15]비트 왼쪽 시프트, 오른쪽 시프트 연산자 사용 예 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int a = 100, result; 06 int i; 07 08 for (i = 1 ; i <= 5 ; i ++) 09 { 10 result = ___①___ 11 printf ("%d << %d = %d\n", a, i, result); 12 } 13 14 for (i = 1 ; i <= 5 ; i ++) 15 { 16 result = ___②___ 17 printf ("%d >> %d = %d\n", a, i, result); 18 } 19 } ---왼쪽 시프트 연산을 5회 반복해서 출력한다. ---오른쪽 시프트 연산을 5회 반복해서 출력한다.
4. 비트 연산자
5. 연산자 우선순위 우선순위가 적용되는 연산자 목록
[예제모음 08] 입력된 두 실수의 산술 연산
[예제모음08] 입력된 두 실수의 산술 연산 01 #include <stdio.h> 02 03 int main( ) 04 { 05 float a, b; 06 float result; 07 08 printf("첫번째 계산할 값을 입력하세요 = = > "); 09 scanf_s("%f", &a); 10 printf("두번째 계산할 값을 입력하세요 = = > "); 11 scanf_s("%f", &b); 12 13 result = a + b; 14 printf(" %5.2f + %5.2f = %5.2f \n", a, b, result); 15 result = a - b; 16 printf(" %5.2f - %5.2f = %5.2f \n", a, b, result); 17 result = a * b; 18 printf(" %5.2f * %5.2f = %5.2f \n", a, b, result); 19 result = a / b; 20 printf(" %5.2f / %5.2f = %5.2f \n", a, b, result); 21 result = (int)a % (int)b; 22 printf(" %d %% %d = %d \n", (int)a, (int)b, (int)result); 23} ---실수형 변수를 선언한다. ---실수를 입력받는다. ---실수를 입력받는다. ---실수의 덧셈이다. ---실수의 뺄셈이다. ---실수의 곱셈이다. ---실수의 나눗셈이다. ---나머지 연산을 위해서 실수를 정수로 강제 형 변환한다.
[예제모음 09] 동전 교환 프로그램
[예제모음09] 동전 교환 프로그램 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int money, c500, c100, c50, c10; 06 07 printf(" ## 교환할 돈은 ? "); 08 scanf_s("%d", &money); 09 10 c500 = money / 500; 11 money = money % 500; 12 13 c100 = money / 100; 14 money = money % 100; 15 16 c50 = money / 50; 17 money = money % 50; 18 19 c10 = money / 10; 20 money = money % 10; 21 ---입력한 돈과 각 동전의 개수를 저장할 변수다. ---키보드로 교환할 액수를 입력한다 ---500원짜리 동전의 개수를 계산한다. ---500원짜리로 바꾼 후 나머지 금액이다. ---100원짜리 동전의 개수를 계산한다. ---100원짜리로 바꾼 후 나머지 금액이다. ---50원짜리 동전의 개수를 계산한다. ---50원짜리로 바꾼 후 나머지 금액이다. ---10원짜리 동전의 개수를 계산한다. ---10원짜리로 바꾼 후 나머지 금액이다.
[예제모음09] 동전 교환 프로그램 22 printf("\n 오백원짜리 = = > %d 개 \n", c500); 23 printf(" 백원짜리 = = > %d 개 \n", c100); 24 printf(" 오십원짜리 = = > %d 개 \n", c50); 25 printf(" 십원짜리 = = > %d 개 \n", c10); 26 printf(" 바꾸지 못한 잔돈 = = > %d 원 \n", money); 27 } ---바꾸지 못한 나머지 돈은 money에 들어 있다.
[예제모음 10] 윤년 계산 프로그램
[예제모음10] 윤년 계산 프로그램 01 #include <stdio.h> 02 03 int main( ) 04 { 05 int year; 06 07 printf("년도를 입력하세요. : "); 08 scanf_s("%d", &year); 09 10 if ( ((year % 4 = = 0) && ( year % 100 != 0 )) || ( year % 400 = = 0) ) 11 printf ("%d 년은 윤년입니다. \n", year); 12 else 13 printf ("%d 년은 윤년이 아닙니다. \n", year); 14 } ---계산할 연도를 입력한다. ---윤년은 입력한 연도가 4로 나누어 떨어지고, 100으로는 나누어 떨어 지지 않아야 한다. 또는 400으로 나누어 떨어져도 된다.
[4장 요약] 1 산술 연산자 ➊ 더하기, 빼기, 곱하기, 나누기 등의 기호로, C에서 처리해야 할 가장 기본적인 연산자다. ➋ 연산자 우선순위는 *, /가 +, -보다 먼저 계산된다. 또한( )는 가장 먼저, =은 가장 나중에 처리된다. ➌ 정수를 실수로 강제 형 변환하려면 정수 앞에 f(loat)를 붙여주면 된다.
[4장 요약] 2 대입 연산자 / 증감 연산자 3 관계 연산자 - 두 값을 비교하는 관계 연산자의 결과는 항상 참이나 거짓으로 표현된다
[4장 요약] 4 논리 연산자 - 두 가지 이상의 조건을 표현하는 경우에 사용하며, 복잡한 조건을 표현할 수 있다. 5 비트 연산자 - 정수나 문자 등을 2진수로 변환한 후에 각 자리의 비트끼리 연산을 수행한다.