Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자

Similar presentations


Presentation on theme: "Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자"— Presentation transcript:

1 Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자
4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자 4.5 비트 연산자 4.6 배정 연산자 4.7 조건 연산자 4.8 증가, 감소 연산자 4.9 콤마 연산자 그 외의 연산자 연산 우선 순위와 결합성 요약 예제

2 연산자의 종류 C 언어의 연산자 산술 연산자(arithmetic operator)
관계 연산자(relational operator) 동등 연산자(equality operator) 논리 연산자(logical operator) 비트 연산자(bitwise operator) 배정 연산자(assignment operator) 조건 연산자(conditional operator) 증가 ,감소 연산자(increment, decrement operator) 콤마 연산자(comma operator) 기타 연산자(cast, sizeof, 포인터 조작 연산자: *, &)

3 연산자의 특징 다른 고급 언어의 연산자와 달리 기계코드의 연산 : 명령어와 1대1로 대응 설계 : 연산 속도 빠름 다양한 연산자(48가지)를 지원 : 조건 연산자(? :), 증감 연산자(++, --), 복합 대입 연산자(+=, -=, *=, /= 등). 프로그램의 간결성(conciseness) 획득 기반

4 4.1 산술 연산자 산술 연산자(+ - * / %)는 이진 연산자이다. (예 4.1) 덧셈 연산자와 자료형 변환
4.1 산술 연산자 산술 연산자(+ - * / %)는 이진 연산자이다. + : 덧셈 (예) 7 + 3 - : 뺄셈 (예) 7 - 3 * : 곱셈 (예) 7 * 3 / : 나눗셈 (예) 7 / 3 % : 나눗셈의 나머지 (예) 7 % 3 (예 4.1) 덧셈 연산자와 자료형 변환 a와 c의 합이 short형인데, 이를 int형으로 바꾸어 b에 배정함 short a, b; int c; . . . b = a + c;

5 4.1 산술 연산자 (예 4.2) 덧셈 연산자와 포인터 변수 short t; . . .
4.1 산술 연산자 (예 4.2) 덧셈 연산자와 포인터 변수 short *s; /* 포인터 변수 선언 */ short t; . . . t = *(s+10); /* (1) */ [해 설] (1)은 s가 가리키는 위치에서 10째 뒤의(즉 s 포함 11번째) short형 자료 가리킴. 즉 s의 주소보다 20번지 뒤의 자료를 가리킴. (short의 크기를 2바이트라 가정)

6 4.1 산술 연산자 연산자의 우선 순위 ()와 접미사로 쓰인 ++ 및 --가 가장 우선순위가 높다.
4.1 산술 연산자 연산자의 우선 순위 ()와 접미사로 쓰인 ++ 및 --가 가장 우선순위가 높다. 단항 연산자가 이항 연산자보다 우선순위가 높다. (예) -a * b – c 첫번째 –는 단항 연산자로 세 연산자 중 가장 우성순위가 높다. 이항연산자 *는 이항연산자 –보다 우선순위가 높다. 결국 ((-a) * b) –c 와 같다.

7 연산자의 결합성: 연속된 동일한 연산의 경우의 순서를 결정함
4.1 산술 연산자 연산자의 결합성: 연속된 동일한 연산의 경우의 순서를 결정함 좌결합성은 좌에서 우로 연산이 진행되며, 우결합성은 우에서 좌로 연산이 진행된다. + - * /는 좌결합성이다. (예) 7 – 5 – 3은 (7 – 5) – 3과 같다. =은 우결합성이다. (예) x = y = z;는 y = z;를 수행하고 x = y 가 수행된다.

8 4.1 산술 연산자 (예 4.3) 산술 연산자의 연산 우선순위와 결합성 P94
4.1 산술 연산자 (예 4.3) 산술 연산자의 연산 우선순위와 결합성 P94 int a, b, c, d; a = 2; b = -3; c = 7; d = -19; [선언 및 배정] [해 설] 수 식 연산 우선순위와 결합성 수식의 결과 c / b / a d / b % a -a * d a % -b * c 9 / c / d -d % c - b / a * 5 7 - a % (3 + b) (c / b) / a (d / b) % a (-a) * d (a % (-b)) * c (9 / c) + ((-20) / d) ((-d) % c) - ((b / a) * 5) 7 - (a % (3 + b)) -1 38 14 2 10 에러 - 단항 연산자 -가 이항연산자 + - * / % 보다 우선순위가 높다. - 산술 연산자는 좌결합성을 갖는다.

9 4.2 관계 연산자 표 4.1 관계 연산자의 종류와 의미 형 식 의 미 수식1 < 수식2 수식1 <= 수식2
4.2 관계 연산자 표 4.1  관계 연산자의 종류와 의미 형 식 의 미 수식1 <  수식2 수식1 <= 수식2 수식1 >  수식2 수식1 >= 수식2 수식1이 수식2보다 작은가(less than)? 수식1이 수식2보다 작거나 같은가(less than or equal to)? 수식1이 수식2보다 큰가(greater than)? 수식1이 수식2보다 크거나 같은가(greater than or equal to)?

10 4.2 관계 연산자 (예 4.4) 관계 연산자의 사용법 (1) 옳은 예 (2) 틀린 예 a < 3 a > b
4.2 관계 연산자 (예 4.4) 관계 연산자의 사용법 (1) 옳은 예 a < 3 a > b -7.7 >= (2) 틀린 예 a =< b /* =와 <의 순서가 틀림 */ a < = b /* <와 = 사이에 공백이 허용되지 않음 */ a >> b /* 관계 연산자가 아니라 이동 연산자 */

11 4.2 관계 연산자 (예 4.5) 관계 연산자의 연산 우선순위와 결합성 int i, j, k; double x, y;
4.2 관계 연산자 (예 4.5) 관계 연산자의 연산 우선순위와 결합성 char c; int i, j, k; double x, y; c = ‘w’; i = 1; j = 2; k = -7; x = 7e+33; y = 0.001; [선언 및 배정] [해 설] 수 식 연산 우선순위와 결합성 수식의 결과 'a' + 1 <  c -i - 5 * j >= k + 1 3 < j < 5 x <= x + y x < x + y ('a' + 1) < c ((-i) - (5 * j)) >= (k + 1) (3 < j) < 5 (x ) <= (x + y) x < (x + y) 1(참) 0(거짓) 산술 연산자의 우선순위가 관계 연산자보다 높다. ③의 수학적 기호 그대로의 의미는 3 < j && j < 5로 표시해야 함 이때 &&(논리연산자 AND)는 <(관계 연산자)보다 우선순위가 낮다. ⑤ 에서는 기계 정밀도가 x와 x+y값의 차이를 표현할 수 없으므로 좌,우변을 같은 값으로 간주한다.

12 4.3 동등 연산자 표 4.2 동등 연산자의 종류와 의미 형 식 의 미 수식1 == 수식2 수식1 != 수식2
4.3 동등 연산자 표 4.2  동등 연산자의 종류와 의미 형 식 의 미 수식1 ==  수식2 수식1 != 수식2 두 수식이 같은가(equal)? 두 수식이 같지 않은가(not equal)?

13 4.3 동등 연산자 (예 4.6) 동등 연산자의 사용법 (1) 옳은 예 (2) 틀린 예 c < ‘w’ X != -2.77
4.3 동등 연산자 (예 4.6) 동등 연산자의 사용법 (1) 옳은 예 c < ‘w’ X != -2.77 22 == /* 결과는 거짓(0)임 */ (2) 틀린 예 a = b /* 배정 수식 */ x = = y - 1 /* =와 = 사이에 공백이 허용되지 않음 */ x =! 44 /* =와 !의 순서가 틀림 */ /* x = (!44) 즉 0이 x에 배정됨 */

14 4.3 동등 연산자 동등연산자 ==와 배정연산자 =의 구별 if (x == 10) y = 1; else y = 0;
4.3 동등 연산자 동등연산자 ==와 배정연산자 =의 구별 int x = 5, y; if (x == 10) y = 1; else y = 0; [프로그램 A] [프로그램 B] [해 설] int x = 5, y; if (x = 10) y = 1; else y = 0; 프로그램 A에서 x값(5)이 10이 아니므로 y에 0이 배정된다. 프로그램 B에서 (x = 10)에서 x에 10이 배정된 후, 그 값(10)이 0이 아니므로(즉 참이므로) y에 1이 배정된다.

15 4.3 동등 연산자 (예 4.7) 동등 연산자의 연산 우선순위와 결합성 int i, j, k;
4.3 동등 연산자 (예 4.7) 동등 연산자의 연산 우선순위와 결합성 [선언 및 배정] [해 설] char c; int i, j, k; c = ‘w’; i = 1; j = 2; k = -7; 수 식 연산 우선순위와 결합성 수식의 결과 'v' == c-1   i + j + k == -2 * j   'v' == (c - 1)   ((i + j) + k) == ((-2) * j) 1(참) 동등 연산자는 산술 연산자보다 연산 우선순위가 낮다.

16 4.4 논리 연산자 사용 형식 표 4.3 논리합과 논리 곱의 의미 이항연산자 && ||와 단항연산자 !
4.4 논리 연산자 사용 형식 이항연산자 && ||와 단항연산자 ! 0은 거짓이고, 0 이외의 값은 참으로 간주된다. 연산 결과가 참이면 통상 1을 사용한다. 형 식 의 미 수식1 &&  수식2 수식1 || 수식2 !수식 논리 곱(logical and) 논리합(logical or) 논리 부정(logical negation) 표 4.3 논리합과 논리 곱의 의미 수식1의 값 수식2의 값 수식1 && 수식2 수식1 || 수식2 0 이외의 값 1

17 4.4 논리 연산자 (예 4.8) 논리 연산자의 사용법 (1) 옳은 예 (2) 틀린 예 2 || 3 !5 a && b !a
4.4 논리 연산자 (예 4.8) 논리 연산자의 사용법 (1) 옳은 예 2 || 3 !5 a && b !a a || b !’z’ a && 1 !(x + 7.7) x || !(2 * (x + a) – 3 – ‘z’) 3 && (-2 * a + 7) (2) 틀린 예 a && /* &&뒤에 수식이 없음 */ a | b /* |는 비트별 연산자 */ a | | b /* |와 | 사이에 공백 없어야 됨 */ &a /* a의 주소(address)를 나타냄 */ a != b /* !=는 not equal로 논리연산자가 아님 */

18 4.4 논리 연산자 (예 4.9) 논리 연산자의 연산 우선순위와 결합성 int i, j, k; double x, y;
4.4 논리 연산자 (예 4.9) 논리 연산자의 연산 우선순위와 결합성 char c; int i, j, k; double x, y; c = ‘w’; i = j = k = 3; x = 0.0; y = 2.3; [선언 및 배정] [해 설] 수 식 연산 우선순위와 결합성 결과 i && j && k i < j && x < y i == j && x <= j j + 1 == !k + 4 'A' <= c && c <= 'Z' c - 1 == 'v' || c + 1 == 'v' (i && j) && k (i < j) && (x < y) (i == j) && (x <= y) (j + 1) == ((!k) + 4) ('A' <= c) && (c <= 'Z') ((c - 1) == 'v') || ((c + 1) == 'v') 1 논리 연산자는 좌결합성을 갖는다. 논리 연산자는 산술, 관계, 동등 연산자보다 연산 우선순위가 낮다.

19 4.4 논리 연산자 (예 4.9 계속) int i, j, k; double x, y;
4.4 논리 연산자 (예 4.9 계속) char c; int i, j, k; double x, y; c = ‘w’; i = j = k = 3; x = 0.0; y = 2.3; [선언 및 배정] 수 식 연산 우선순위와 결합성 결과 i == 2 || j == 4 || k == 6 i == 2 || j == 4 || (k = 6) ! (i - j) !i - j !-i -j x * !y x / !!y !!!x x / !y ((i == 2) || (j == 4)) || (k == 6) ((i == 2) || (j == 4)) || (k = 6) (!i) - j (!(-i)) - j x * (!y) x / (!(!y)) !(!(!x)) x / (!y) 1 -3 0.0 에러

20 prog4-10.c short-circuit식 평가 [해 설]
4.4 논리 연산자 /* File : prog4-10.c 합선(short-circuit) 식 평가 */ int main(void) 4 { int den = 0, num = 5; if (den == 0 || num / den == 0) printf(“Haha\n”); 8 } prog4-10.c short-circuit식 평가 [해 설] Haha가 출력 된다. den == 0가 참이 되고 || 우측의 평가는 일어나지 않는다. 우측 평가가 이루어 진다면, 0으로 나누는 에러가 발생 &&과 ||의 short-circuit 식 평가 좌측의 피연산자(수식1)를 먼저 평가한다. 수식1 && 수식2 - 수식1이 거짓(0)이면 수식2 평가 없이 결과가 0(거짓). 수식1 || 수식2 - 수식1이 참(0이외의 값)이면 수식2 평가 없이 결과가 1(참) C, C++, Java, Lisp언어의 논리 연산 시 short-circuit 사용 Pascal 등의 언어는 short-circuit를 보장하지 못한다. 따라서 논리 연산 시 수식2가 먼저 평가될 수도 있음.

21 표 3.5 비트별 and, or, exclusive_or의 의미
4.5 비트 단위 연산자 표 4.4  비트 연산자의 종류와 의미 형 식 의 미 수식1 &  수식2 수식1 | 수식2 수식1 ^  수식2 수식1 << 수식2 수식1 >> 수식2 ~수식 비트별 and   논리 연산자(logical operator) 비트별 or      논리 연산자 비트별 exclusive or 논리 연산자 좌로 이동(shift left)   이동 연산자(shift operator) 우로 이동(shift right) 이동 연산자 1의 보수(unary bitwise complement) 표 3.5  비트별 and, or, exclusive_or의 의미 x y x&y x|y x^y

22 4.5 비트 단위 연산자 (bit-wise operator)
(예 4.11) 비트별 논리 연산자와 보수연산자의 예 int x, y; x = 33333; y = ; [선언 및 배정] [해 설] 수 식 2진수 표현 결과 x y x & y x ^ y x | y ~ ( x| y) 33333 -77777 32805 -77249 77248 정수형 int의 크기가 32비트라 가정한다.

23 4.5 비트 연산자 (예 4.12) 좌로 이동 연산자의 예 [선언 및 배정] [해 설]
4.5 비트 연산자 (예 4.12) 좌로 이동 연산자의 예 [선언 및 배정] [해 설] char x = ‘Z’, y; 배정식 y의 2진수 표현 효과 y = x y = x << 1 y = x << 4 이동 없음 좌로 1번 이동 좌로 4번 이동 이동된 나머지 우측 비트들에는 0이 채워진다.

24 4.5 비트 연산자 (예 4.13) 이동 연산자의 예 unsigned char u;
4.5 비트 연산자 (예 4.13) 이동 연산자의 예 char x, y; unsigned char u; x = ‘Z’; y = ‘Z’ << 1; u = -1; [선언 및 배정] [해 설] 수 식 2진수 표현 효과 x x >> 1 y y >> 3 u u >> 5 이동 없음 우로 1번 이동 우로 3번 이동 우로 5번 이동 (Q) 이동된 나머지 좌측 비트들에는 무엇이 채워지는가? unsigned형인 경우: 0이 채워진다. signed형인 경우 위 같이 부호비트를 채우는 시스템(산술 이동)도 있고 0으로 채우는 시스템(논리 이동)도 있다.

25 4.5 비트 연산자 (예 4.14) 우로 이동 연산자의 예 [선언 및 배정] [해 설]
4.5 비트 연산자 (예 4.14) 우로 이동 연산자의 예 [선언 및 배정] [해 설] char x = 7; 수 식 2진수 표현 효과 x x << 1 x << 4 x >> 1 x >> 3 7 14 112 3 7×2 7×24 7/2 의 몫 (오른쪽 1비트 손실) 7/23 의 몫 (오른쪽 3비트 손실) 이동 연산자 오른쪽 수식은 음수가 아니어야 함

26 4.5 비트 연산자 (예 4.15) 이동 연산자의 연산 우선 순위와 결합성 char c; int i, j,k;
4.5 비트 연산자 (예 4.15) 이동 연산자의 연산 우선 순위와 결합성 [선언 및 배정] [해 설] char c; int i, j,k; c = ‘w’; i = j = k = (3 << 1); 수 식 연산 우선 순위와 결합성 수식의 형 c << 1 << 2 c + 1 << 1 i < j >> k * 3 && j == k (c << 1) << 2 (c + 1) << 1 (i < (j >> (k * 3))) && (j == k) char int 이동 연산자는 좌결합성을 갖는다. 이동 연산자(>>)의 우선 순위는 산술 연산자(*)보다 낮다. 이동 연산자의 우선 순위는 관계 연산자(<)보다 높다. 관계 연산자(<)의 우선 순위는 논리 연산자(&&)보다 높다. 동등연산자(==)의 우선순위는 논리 연산자(&&)보다 높다.

27 4.6 배정 연산자 표 4.6 (복합)배정 연산자의 종류 형 식 의 미 변수 = 수식 변수 += 수식 변수 -= 수식
4.6 배정 연산자 표 4.6  (복합)배정 연산자의 종류 형 식 의 미   변수 = 수식   변수 += 수식   변수 -= 수식   변수 *= 수식   변수 /= 수식   변수 %= 수식   변수 <<= 수식   변수 >>= 수식   변수 &= 수식   변수 ^= 수식   변수 |= 수식   변수 = (수식)   변수 = 변수 + (수식)   변수 = 변수 - (수식)   변수 = 변수 * (수식)   변수 = 변수 / (수식)   변수 = 변수 % (수식)   변수 = 변수 << (수식)   변수 = 변수 >> (수식)   변수 = 변수 & (수식)   변수 = 변수 ^ (수식)   변수 = 변수 | (수식)

28 4.6 배정 연산자 (예) +=의 사용 예 (예 4.16) 배정 수식의 예 i += 10; /* i = i + 10; */
4.6 배정 연산자 (예) +=의 사용 예 int i; i += 10; /* i = i + 10; */ (예 4.16) 배정 수식의 예 k *= 3 + x /* k = k * (3 + x) */ a[i] /= /* a[i] = a[i] / (5 + 7) */

29 4.6 배정 연산자 (예 4.17) 배정 연산자의 연산 우선 순위와 결합성 [선언 및 배정]
4.6 배정 연산자 (예 4.17) 배정 연산자의 연산 우선 순위와 결합성 [선언 및 배정] [해 설] int i, j, k, m, n; i = j = k = m = n = 3; 수 식 우선 순위와 결합성 결과 k %= m = 1 + n / 2 1 + 3 * (n += 7) / 5 1 + 3 * n += 7 / 5 k = (k % (m = (1 + (n / 2)))) 1 + (3 * (n = (n + 7)) / 5) (1 + (3 * n)) += (7 / 5) 1 7 형식에 맞지 않음 배정 연산자는 산술 연산자보다 연산 우선 순위가 낮다. 배정 연산자는 우결합성을 갖는다.

30 4.7 조건 연산자 C언어에서 조건 연산자(conditional operator)로 3항 연산자가 제공된다.
4.7 조건 연산자 C언어에서 조건 연산자(conditional operator)로 3항 연산자가 제공된다. (형식 ) 수식1 ? 수식2 : 수식3 수식1이 평가되어 참이면 수식2가 평가되고, 거짓이면, 수식3이 평가된다. 아래 두 문장은 동일한 의미이다. (1) 기본형 min = (y < z) ? y : z; if (y < z) min = y; else min = z; (2) 중첩형 c = (a>b) ? a : (a<b) ? -a : b)); if(a>b) c = a; else if(a<b)         c = -a; else        c = b;

31 printf("\n%d tree%c", k, (k==1)?'\0':'s');
4.7 조건 연산자 (예 4.18) 조건 연산자의 연산 우선 순위와 결합성 char a = ‘a’, b = ‘b’, c = ‘c’; int i = 1, j = 2, k = 3; float x = 3.337; [선언 및 배정] [해 설] 수 식 우선 순위와 결합성 결과값 i == j ? a - 1 : b + 1 k % 3 == 0 ? i : x + 1 k % 3 ? i : x + 1 (i == j) ? (a - 1) : (b + 1) ((k % 3) == 0) ? i : (x + 1) (k % 3) ? i : (x + 1) 99 1.0 4.337 int float 문 장 출력 결과 printf("\n%d tree%c", k, (k==1)?'\0':'s'); 3 trees 조건 연산자 ? :은 우결합성을 갖는다. (Q)‘수식1 ? 수식2 : 수식3’의 형(type)은? (A) 수식2와 수식3의 형에 의해 결정된다. 따라서, 수식2와 수식3이 다른 형이면 (평가여부와 상관없이) 무조건 형 변환이 일어난다.

32 4.8 증가, 감소 연산자 (예 4.19) 증가, 감소 연산자 (1) 옳은 예 (2) 틀린 예 ++count --kk
4.8 증가, 감소 연산자 (예 4.19) 증가, 감소 연산자 (1) 옳은 예 ++count --kk ++index going_down-- count++ kk-– (2) 틀린 예 /* 상수는 증가될 수 없음 */ ++(black/night) /* 수식은 증가될 수 없음 */

33 4.8 증가, 감소 연산자 다음의 (1)’과 같다. 다음의 (2)’과 같다. (1)은 a를 b에 배정한 후 a값을 증가시킨다.
4.8 증가, 감소 연산자 b = a++; /* (1) */ b = ++a; /* (2) */ (1)은 a를 b에 배정한 후 a값을 증가시킨다. 다음의 (1)’과 같다. (2)는 a를 증가시킨 후 b에 배정된다. 다음의 (2)’과 같다. b = a; a++; /* (1)’ */ a++; b = a; /* (2)’ */ 감소 연산자의 경우도 마찬가지다.

34 4.8 증가, 감소 연산자 (예 4.20) 증가 연산자의 예: b값이 3, c값이 7로 각 연산을 수행해보자. (1) (2)
증가, 감소 연산자 (예 4.20) 증가 연산자의 예: b값이 3, c값이 7로 각 연산을 수행해보자. (1) (2) a = b + c++; a = b + c + 1;

35 4.8 증가, 감소 연산자 (예 4.20 계속) b값이 3, c값이 7로 각 연산을 수행해보자. (3) [해 설]
증가, 감소 연산자 (예 4.20 계속) b값이 3, c값이 7로 각 연산을 수행해보자. (3) [해 설] a = b + ++c + c; (3)의 경우 가운데 c값은 ++때문에 사용되기 전에 증가된다. 그 뒤의 c가 증가 전과 후의 어느 값을 쓰는가는 컴파일러에 따라 다를 수 있다. 즉 a는 19일 수고 있고 18일 수도 있다. 이 현상을 side effect(부수효과 또는 부작용)라 한다. 의도한 바를 분명히 하려면 다음과 같은 식으로 해야 한다. ++c; a = b + c + c;

36 4.8 증가, 감소 연산자 (예 4.21) 증가,감소 연산자의 연산 우선 순위와 결합성 [선언 및 배정] [해 설]
증가, 감소 연산자 (예 4.21) 증가,감소 연산자의 연산 우선 순위와 결합성 int a, b, c, d, e, f, g, h, i, j, k, m, n; a = b = c = d = e = f = g = h = i = j = k = m = n = 3; [선언 및 배정] [해 설] 수 식 연산 우선 순위와 결합성 결과 - - -a - --a -- -a b - --c d-- - e -f-- -g f++ = g h++ / ++i * --j ++k / m++ * --n -(-(-a)) -(--a) --(-a) b - (--c) (d--) - e (-(f--)) - g (f++) = g (((h++) / (++i)) * (--j) (((++k) / (m++)) * (--n) -3 -2 형식에 맞지 않음 1 -6 2 증가, 감소 연산자의 우선 순위는 단항 연산자 –와 같다. 증가, 감소 연산자는 우결합성을 갖는다.

37 4.9 콤마 연산자 콤마로 수식을 열거할 수 있다. i2의 최종값 11이 i1에 배정된다. 위는 다음과 같은 순서로 수행된다.
4.9 콤마 연산자 콤마로 수식을 열거할 수 있다. 수식1, 수식2, 수식3, . . . 콤마 연산자는 좌결합성을 가진다. 즉 열거된 순서대로 수식이 평가된다. int i1, i2; i1 = (i2 = 10, i2++); i2의 최종값 11이 i1에 배정된다. 위는 다음과 같은 순서로 수행된다. int i1, i2; i2 = 10; i2++; i1 = i2;

38 4.9 콤마 연산자 (예 4.22) 콤마 연산자의 예 int i, j, k = 3; double x = 3.3;
콤마 연산자 (예 4.22) 콤마 연산자의 예 int i, j, k = 3; double x = 3.3; [선언 및 배정] [해 설] 수 식 연산 우선 순위와 결합성 결과 i = 1, j = 2, ++k + 1 k != 1, ++x * ((i = 1), (j = 2)), ((++k) + 1) (k != 1), (((++x) * 2.0) + 1) 5 9.6 열거된 수식이 순서대로 집행된다.

39 4.10 그 외의 연산자 형 변환(cast) 연산자 (예 4.23) cast 연산자의 사용 예 (자료형_이름) 수식
그 외의 연산자 형 변환(cast) 연산자 명시적 자료형 변환을 할 수 있다. (자료형_이름) 수식 k = (double) i; (예 4.23) cast 연산자의 사용 예 char c; int i = 1, j = 2, k; double x = -30.0, y; c = (char) (3 – 3.14 * x); k = (int) ((int) x + (double) i + j); y = (float) (i + 3);

40 4.10 그 외의 연산자 sizeof 연산자 (1) sizeof(수식) (2) sizeof(자료형_이름)
그 외의 연산자 sizeof 연산자 연산 대상이 차지하는 바이트 수를 구함 (1) sizeof(수식) (2) sizeof(자료형_이름) (예 4.24) sizeof 연산자의 사용 예 (1)과 (2)의 각각의 사용 예를 보여준다. short이 2바이트, int가 4바이트라면 x는 4, y는 2가 된다. short s; int i, x, y; x = sizeof(s + i); /* (1) */ y = sizeof(short); /* (2) */

41 4.10 그 외의 연산자 포인터 조작 연산자 *와 & (예 4.25) 포인터 조작 연산자의 예
그 외의 연산자 포인터 조작 연산자 *와 & *는 포인터 변수가 가리키는 내용 &는 자료의 주소 (예 4.25) 포인터 조작 연산자의 예 (1)은 buf[0]의 주소를 pc에 저장한다. buf는 첫 성분의 주소 즉 &buf[0]와 동일하다. (2)는 pc가 가리키는 문자(‘G’)를 c1에 저장한다. *pc는 문자 포인터 pc가 가리키는 내용(즉 문자) (3)은 pc가 가리키는 것 3 개 뒤의 것(즉 ‘c’)을 c2에 저장한다. c2 = buf[3];으로 기술해도 같다. char *pc, c1, c2, buf[100] = {“Grace Park”}; pc = buf; /* (1) */ c1 = *buf; /* (2) : 문자 ‘G’ */ c2 = *(pc + 3); /* (3) : 문자 ‘c’ */

42 4.11 연산 우선 순위와 결합성 표 4.7 C 언어 연산자의 우선 순위와 결합성 연산자(우선 순위 높은 것부터 열거) 결합성
연산 우선 순위와 결합성 표 4.7  C 언어 연산자의 우선 순위와 결합성 연산자(우선 순위 높은 것부터 열거) 결합성 ()  []  ->  .  ++(접미사) --(접미사) ++(접두사)  --(접미사)   !   ~   sizeof +(단항)  -(단항)  &(주소)  *(내용) *    /    % +    - << >> <    <=    >    >= ==    != & ^ | && || ? : =  +=  -=  *=  /=  >>=  <<=  &=  ^=  |= , (콤마 연산자) 좌결합 우결합

43 4.13 예 제 예제 4.1 output 1 /* File : ex4-1.c 2 정수 710을 우로 4비트 이동 */
예 제 /* File : ex4-1.c 정수 710을 우로 4비트 이동 */ #include <stdio.h> int main(void) { int a = 710, b = 4; printf(“%d\n”, a >> b); } 예제 output 44 

44 - 비트별 연산자 & | ^ 등은 비트별로 논리적 연산이 이루어 진다. - 2진법으로 a는 0101, b는 0011 이므로
/* File : ex4-2.c 두 수 5와 3의 비트별 AND, OR, XOR을 구하시오. */ #include <stdio.h> int main(void) { int a = 5, b = 3; int c, d, e; 8 c = a & b; d = a | b; e = a ^ b; printf(“%d %d %d\n”, c, d, e); } 예제 [해 설] output - 비트별 연산자 & | ^ 등은 비트별로 논리적 연산이 이루어 진다. - 2진법으로 a는 0101, b는 0011 이므로 각 연산 결과는 이다. - 따라서 10진법으로는 각각 이다. 1 7 6

45 논리 연산(&& || !)에서 0은 거짓, 0이 아닌 수는 참으로 간주됨. 연산 결과가 참이면 1, 거짓이면 0이 된다.
/* File : ex4-3.c 두 수 5와 3의 논리적 AND, OR과 논리적 부정을 구하시오. */ #include <stdio.h> int main(void) { int a = 5, b = 3; int c, d, e; 8 c = a && b; d = a || b; e = !a; printf(“%d %d %d\n”, c, d, e); } 예제 [해 설] output 논리 연산(&& || !)에서 0은 거짓, 0이 아닌 수는 참으로 간주됨. 연산 결과가 참이면 1, 거짓이면 0이 된다. 1 1 0

46 줄11에서 a는 덧셈이 일어나기 전에 감소시켜 1을 갖는다. 감소된 a값(1)과 b는 현재 값(3)을 더한다.
/* File : ex4-4.c 다음 프로그램의 결과는 무엇인가? */ #include <stdio.h> int main(void) { int a = 0, b, c; 7 b = ++a; c = b++; printf(“%d %d %d\n”, a, b, c); 9 c = ++a + ++b; printf(“%d %d %d\n”, a, b, c); 11 c = --a + b--; printf(“%d %d %d\n”, a, b, c); 13 } 예제 [해 설] output 줄11에서 a는 덧셈이 일어나기 전에 감소시켜 1을 갖는다. 감소된 a값(1)과 b는 현재 값(3)을 더한다. 덧셈이 일어난 후에 b값이 감소하여 2가 된다. 1 2 1 2 3 5 1 2 4 

47 예제 4.5 [해 설] output *p1에 저장하면 바로 x에 저장하는 것과 같다. 왜냐하면 p1이 x의 주소이니까.
/* File : ex4-5.c 주소 연산자와 포인터 연산자를 이용 변수 x에 100, y에 200을 배정한 후 x + y를 출력하시오. */ #include <stdio.h> int main(void) { int x, *p1, y, *p2; p1 = &x, p2 = &y; *p1 = 100, *p2 = 200; printf(“%d\n”, x+y); 11 } 예제 [해 설] output *p1에 저장하면 바로 x에 저장하는 것과 같다. 왜냐하면 p1이 x의 주소이니까. 300

48 예제 4.6 [해 설] output 조건 연산자 ? : 을 사용한다. 1 /* File : ex4-6.c
, 35, 21, 96 중에서 최대값을 조건 연산자 이용해 구하는 프로그램 */ #include <stdio.h> int main(void) { int a = 18, b = 35, c = 21, d = 96; int max; max = (a > b) ? a : b; max = (max > c) ? max : c; max = (max > d) ? max : d; printf(“%d\n”, max); 12 } 예제 [해 설] output 조건 연산자 ? : 을 사용한다. 96

49 예제 4.7 output 1 /* File : ex4-7.c 2 && 와 || 와 ! 의 사용 예 */
&& 와 || 와 ! 의 사용 예 */ #include <stdio.h> int main(void) { int i = 0, j = 0, x, y; x = i && j;; printf(“%d %d %d\n”, i, j, x); y = !(i || j || x); printf(“%d %d %d\n”, i, j, y); 11 } 예제 output 0 0 0 0 0 1 

50 4.13 예 제 (예제 4.8) 다음 각 배정문의 의미는 무엇인가? unsigned int portset = 1543;
예 제 (예제 4.8) 다음 각 배정문의 의미는 무엇인가? unsigned int portset = 1543; unsigned char hibyte; unsigned char lobyte; (1) highbyte = portset >> 8;/* 8비트 우로 이동 */ lobyte = portset; /* 절삭에 의존 */ (2) highbyte = (portset >> 8) & 0377 lobyte = portset % 0377; (1)과 (2)의 결과는 동일하다. (1) 2째 바이트와 1째 바이트 값이 각각 8비트 길이의 hibyte와 lobyte에 저장된다. (2) 8비트 마스크를 이용하여 해당 바이트를 저장한다. 0377은 8진수 377이므로 2진수로 임

51 이동 연산(<<)을 이용하여 문자를 좌측 바이트로 옮기고, 최하위 바이트에 새로운 문자를 저장하고 있다.
/* File : ex4-9.c 이동 연산자를 이용하여 2개의 문자를 하나의 정수형 int의 하위 2 바이트에 1개씩 넣는 프로그램을 작성하고 확인하시오. */ #include <stdio.h> int main(void) { char a = ‘H’, b = ‘A’; int w; w = a; printf(“%d\n”, w); w = (w << 8) | b; printf(“%d\n”, w); 13 } 예제 [설 명] output 이동 연산(<<)을 이용하여 문자를 좌측 바이트로 옮기고, 최하위 바이트에 새로운 문자를 저장하고 있다. 1문자 저장 후와 2문자 저장 후에 그 값을 정수로 출력하였다. 72 18497

52 줄 8 : w의 최하위 바이트를 추출하여 b에 저장한다. 0xff00은 아래서 두 번째 바이트 추출을 위한 마스크이다.
/* File : ex4-10.c 정수형 int에서 하위 바이트부터 차례로 두 문자를 추출하여 출력 */ #include <stdio.h> int main(void) { int w = 18497; /* 예제 4.9의 결과를 저장 */ char a, b; b = w & 0xff; printf(“%c\n”, b); a = (w & 0xff00) >> 8; printf(“%c\n”, a); 12 } 예제 [설 명] output 0xff는 16진법으로 ff이므로 2진법 과 같다. 줄 8 : w의 최하위 바이트를 추출하여 b에 저장한다. 0xff00은 아래서 두 번째 바이트 추출을 위한 마스크이다. 줄10 : 둘째 바이트를 추출하여 최하위 바이트 위치로 이동한다. A H


Download ppt "Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자"

Similar presentations


Ads by Google