연산자와 표현식 C H A P T E R 3
소개 C 에는 많은 내장 연산자가 있다 프로그램에서 연산자는 데이터와 변수 조작에 사용 C 연산자의 분류 1. 산술 연산자 2. 관계 연산자 3. 논리 연산자 4. 대입 연산자 5. 증가 감소 연산자 6. 조건 연산자 7. 비트 연산자 8. 특수 연산자 2
3.2 산술 연산자 산술 연산자는 다른 언어에서와 같은 의미 C 의 모든 내장 자료형에 대해서 사용할 수 있다 3
a+b 와 같은 간단한 산술 연산에서 두 개의 피연산자가 정수이면 정수형 산술 계산 결과는 언제나 정수값을 만든다 Ex) a = 14, b = 4 a – b = 10 a + b = 18 a * b = 56 a / b = 3 ( 소수부분 버림 ) a % b = 2 ( 나눗셈의 나머지 ) 3.2 산술 연산자 4
정수 나눗셈에서 두 피연산자가 같은 부호이면 소수부는 0 으로 절단되지만, 피연산자가 다른 부호이면 기계에 따라 소수부 절단의 결과가 달라질 수 있다 6 / 7 = 0 -6 / -7 = 0 -6 / 7 = 0 또는 -1 ( 기계에 따라 다름 ) 비슷하게, 나머지 연산에서 결과는 항상 첫 번째 피연산자 ( 피제수 ) 의 부호이다 -14 % 3 = % -3 = % -3 = 산술 연산자 5
그림. 3.1 정수 산술의 예 3.2 산술 연산자 6
실수 계산 만약 x, y, z 가 float 라면 x = 6.0 / 7.0 = y = 1.0 / 3.0 = z = -2.0 / 3.0 = 혼합형 계산 피연산자가 하나는 실수이고 다른 하나는 정수일 때 15 / 10.0 = 1.5 ( 혼합 ) 15 / 10 = 1 ( 혼합이 아님 ) 3.2 산술 연산자 7
두 개의 양을 비교하여 그 관계에 따라 결정을 내릴 때 사용 관계 연산자 이런 비교는 관계 연산자 이용 3.3 관계 연산자 8
산술 연산자는 관계 연산자보다 우선순위가 더 높다 ifwhile 관계 연산식은 if 나 while 같은 판단문에서 사용된다 9
3.4 논리 연산자 C 에 있는 논리 연산자 && 의미는 AND || 의미는 OR ! 의미는 NOT 논리 연산자 && 와 || 는 하나 이상의 조건을 평가하여 결정을 내릴 때 사용 10
3.4 논리 연산자 논리식의 사용 예 : 1. if (age > 55 && salary < 1000) 2. if (number 100) 관계 연산자와 논리 연산자의 상대적인 우선순위 : 높음 ! > >= < <= == != && 낮음 || 11
3.5 대입 연산자 축약 대입연산자의 세 가지 장점 1. 왼편을 반복할 필요가 없어서 더 쓰기 쉽다 2. 문장이 더 간략하고 읽기 쉽다 3. 문장이 더 효율적이다 12
3.5 대입 연산자 13
3.6 증가와 감소 연산자 ++m; 은 m = m + 1; (or m += 1;) 와 같다 --m; 은 m = m – 1; (or m -= 1;) 와 같다 ++m 와 m++ 는 독립적으로 사용되면 똑같지만 대입문의 오른편 표현식으로 사용된다면 의미가 다르다 14
전위 연산자는 피연산자에 1 을 더하고난 결과가 왼편의 변수에 저장된다 m = 5; y = ++m; 결과는 y 와 m = 6 후위 연산자는 왼편의 변수에 값을 대입하고 나서 피연산자가 증가된다 m = 5; y = m++; 결과는 y = 5 이고 m = 증가와 감소 연산자 15
3.6 증가와 감소 연산자 16
3.7 조건 연산자 3 항 연산자 “ ?: “ 는 다음과 같이 사용한다 ?: 는 다음과 같이 처리된다 : 1. exp1 이 계산된다 2. 만일 exp1 이 0 이 아니면 ( 참 ), exp2 가 계산되고 이 표현식의 값이 된다 3. 만일 exp1 이 거짓이면, exp3 이 계산되고 이 값이 표현식의 값이 된다 17
3.7 조건 연산자 예를 들어, a = 10; b = 15; x = ( a > b ) ? a : b; 이것은 if..else 문을 사용하여 나타낼 수 있다 If ( a > b ) x = a; else x = b; 18
3.8 비트 연산자 비트 연산자C 에는 데이터를 비트 수준에서 다루기 위한 비트 연산자 가 있다 비트를 검사하거나 오른쪽 또는 왼쪽으로 이동 시킨다 floatdouble 비트 연산자는 float 나 double 형의 데이터에는 사용할 수 없다 19
3.9 특수 연산자 C 에서 지원하는 특수 연산자 1. 쉼표 연산자 sizeof 2. sizeof 연산자 3. 포인터 연산자 (& 와 *) → 11 장 4. 멤버 선택 연산자 (. 와 ->) → 10,11 장 20
3.9 특수 연산자 쉼표 연산자 쉼표 연산자 쉼표 연산자는 관련된 표현식을 연결시키는데 사용한다 왼쪽에서 오른쪽으로 가장 오른쪽 쉼표로 연결된 표현식은 왼쪽에서 오른쪽으로 평가되고 가장 오른쪽 표현식의 값이 전체 표현식의 값이다 Value = ( x = 10, y = 5, x+y ); xyvalue 결과는 x 에 10, y 에 5, value 에 15 가 대입된다 21
3.9 특수 연산자 쉼표 연산자는 모든 연산자 중에서 가장 낮은 우선순위를 가지기 때문에 괄호가 필요하다 쉼표 연산자의 적용 예 : for for 루프 : for ( n = 1, m = 10, n <= m; n++, m++) while while 루프 : while ( c = getchar (), c != ‘10’) 값의 교환 : t = x, x = y, y = t; 22
3.9 특수 연산자 sizeof 연산자sizeof 연산자 sizeofsizeof 는 컴파일시간 연산자이며, 피연산자가 차지하는 바이트 수를 반환한다 sizeof m=sizeof (sum); sizeof n =sizeof (long int); sizeof k =sizeof (235L); sizeofsizeof 연산자는 배열과 구조체의 길이를 알아내기 위해서 사용한다 프로그램의 실행 중에 기억공간을 동적으로 변수에 할당할 때 사용한다 23
3.9 특수 연산자 그림. 3.3 산순 연산자의 사용 예 24
3.10 산술식 산술식은 프로그래밍 언어의 문법에 따라 구성된 변수, 상수, 연산자의 조합이다 C 는 복잡한 수학 표현식도 나타낼 수 있다 25
3.11 표현식의 계산 문장에서 표현식이 먼저 평가되고 그 결과가 왼쪽 변수의 기존값을 대체한다 표현식에서 사용된 모든 변수들은 계산이 일어나기 전에 값을 가지고 있어야 한다 x = a * b – c; y = b / c * a; z = a – b / c + d; 이런 문장에서 변수 a,b,c,d 는 표현식에 사용되기 전에 값이 정의되어 있어야 한다 26
그림. 3.4 표현식의 계산 3.11 표현식의 계산 27
3.12 산술 연산자의 우선순위 왼쪽에서 오른쪽 괄호가 없는 산술식에서는 연산자 우선순위에 따라 왼쪽에서 오른쪽으로 연산이 수행된다 높은 우선순위 * / % 낮은 우선순위 + - 예 ) 그림 3.4 x = a –b/3 + c * 2 -1 a = 9, b = 12, c = 3 일 때 x = /3 + 3 *
3.12 산술 연산자의 우선순위 첫 번째 패스 1 단계 : x = 9 – * 단계 : x = 9 – 두 번째 패스 3 단계 : x = – 1 4 단계 : x = 11 – 1 5 단계 : x = 10 29
괄호를 넣어서 계산 순서를 바꿀 수 있다 : 9 – 12 / ( ) * ( 2 – 1 ) 첫 번째 패스 1 단계 : 9 – 12 / 6 * ( 2 – 1 ) 2 단계 : 9 – 12 / 6 * 1 두 번째 패스 3 단계 : 9 – 2 * 1 4 단계 : 9 – 2 세 번째 패스 5 단계 : 산술 연산자의 우선순위 30
3.12 산술 연산자의 우선순위 31
3.13 계산에서의 문제 실수에서의 값은 근사치이고 이런 근사에 의한 오차는 중대한 문제를 일으킬 수 있다 a = 1.0 / 3.0; b = a * 3.0; b 계산된 b 의 결과값이 1 이 된다고 보장할 수 없다 또 다른 문제는 0 으로 나누는 경우 대부분의 컴퓨터에서는 비정상적으로 프로그램이 종료된다 오버플로우와 언더플로우 오류 피연산자가 올바른 자료형과 범위인지를 확실히 해야만 오버플로우와 언더플로우가 발생되지 않는다 32
그림 3.6 부동수수점에서 반올림 오차 3.13 계산에서의 문제 33
3.14 표현식에서 형변환 묵시적 형변환 묵시적 형변환 C 에서 표현식에 서로 다른 형의 상수와 변수를 섞어 쓸 수 있다 피연산자의 형이 다르면 연산이 수행되기 전에 ‘ 낮은 ’ 형은 ‘ 높은 ’ 형으로 자동 변환된다 그림 3.7 묵시적 형변환 과정 34
shortcharint 모든 short 와 char 는 자동적으로 int 로 변환된다 long double 1. 피연산자중 하나가 long double 이면, 다른 피연산자는 long doublelong double long double 로 변환되고 결과도 long double 이 된다 double 2. 그렇지 않고, 피연산중 하나가 double 이면, 다른 피연산자는 doubledouble double 로 변환되고 결과도 double 이 된다 float 3. 그렇지 않고, 피연산자중 하나가 float 이면, 다른 피연산자는 floatfloat float 로 변환되고 결과도 float 가 된다 unsigned long int 4. 그렇지 않고, 피연산자 하나가 unsigned long int 이면, 다른 피연산자는 unsigned long int unsigned long int unsigned long int 로 변환되고 결과도 unsigned long int 가 된다 3.14 표현식에서 형변환 35
long int unsigned int 5. 그렇지 않고, 피연산자 하나가 long int 이고 다른 피연산자가 unsigned int 이면, unsigned int 가 long intunsigned int (a) 만약 unsigned int 가 long int, 로 변환될 수 있으면 unsigned int long int 피연산자는 그렇게 변환되고 결과도 long int 가 된다. unsigned long int (b) 그렇지 않으면, 두 피연산자는 unsigned long int 로 변환되고 unsigned long int 결과도 unsigned long int 가 된다. long int 6. 그렇지 않고, 피연산자 하나가 long int 이면, 다른 피연산자는 long int long int long int 로 변환되고 결과도 long int 가 된다. unsigned int 7. 그렇지 않고, 피연산자 하나가 unsigned int 이면, 다른 피연산자는 unsigned int unsigned int unsigned int 로 변환되고 결과도 unsigned int 가 된다 표현식에서 형변환 36
3.14 표현식에서 형변환 37
표현식의 최종 결과는 변수에 대입되기 전에 대입기호 횐편의 변수형으로 변환된다 floatint 1. float 에서 int 로의 대입은 소수 부분이 절단된다 double float 2. double 에서 float 로의 대입은 반올림이 발생한다 long int int 3. long int 에서 int 로의 대입은 초과되는 상위 비트를 잘라낸다 3.14 표현식에서 형변환 38
명시적 변환 명시적 변환 예 ) ratio = female_number / male_number female_numbermale_number ratiofemale_number 와 male_number 가 정수로 선언되었기 때문에 나눗셈 결과의 소수 부분은 없어지고 ratio 는 잘못된 값을 나타낸다 이 문제는 변수 하나를 부동소수점 형으로 일시적으로 변환하여 해결할 수 있다 float ratio = (float) female_number / male_number 3.14 표현식에서 형변환 39
floatfemale number 연산자 (float) 는 변수 female number. 의 원래 값에는 영향을 미치지 않는다 female number intfemale number 의 형은 프로그램의 다른 부분에서는 int 로 남아 있는다 3.14 표현식에서 형변환 40
그림 3.8 캐스팅의 사용 3.14 표현식에서 형변환 41
3.15 연산자 우선순위와 결합규칙 높은 우선순위의 연산자가 먼저 평가된다 같은 수준의 연산자들은 ‘ 왼쪽에서 오른쪽 ’ 이나 ‘ 오른쪽에서 왼쪽 ’ 으로 평가된다. 42
3.15 연산자 우선순위와 결합규칙 43
3.16 수학 함수 대부분의 C 컴파일러는 기본 수학 함수를 지원한다 : xydouble 주의 : 1. x 와 y 는 double 로 선언되어야 한다 xy 2. 삼각함수와 쌍곡선함수의, x 와 y 는 라디안 값이다 double 3. 모든 함수는 double 값을 반환한다 floatlong double 4. C99 에는 이런 함수들의 float 와 long double 버전이 ] 추가되어 있다 5. C99 에는 더 많은 수학 함수를 지원한다 6. 더 상세한 것은 부록 “C99 특징 ” 을 참조 44
3.16 Mathematical Functions 45
요약 1 46
요약 2 47
그림 3.9 판매사원 급여계산 프로그램 사례 연구 48
그림 3.9 판매사원 급여계산 프로그램 사례 연구 49