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

Slides:



Advertisements
Similar presentations
기본 자료형 순천향대학교 정보기술공학부 이 상 정. 자료형의 선언 컴퓨터프로그래밍 1 순천향대학교 정보기술공학부 이 상 정 3 자료형 선언 기본 자료형문자형 char 정수형 int 실수형 float double 형없음 void.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
프로그래밍1 및 실습 (C언어) - 3장 기본자료형 (3.6부터 끝까지) -
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express Slide 1 (of 34)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 1장 C 언어의 소개.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
시스템 생명 주기(System Life Cycle)(1/2)
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
4장: 자료형과 수식.
시스템 생명 주기(System Life Cycle)(1/2)
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
6장. printf와 scanf 함수에 대한 고찰
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
제 18 강 데이터 타입 타입, 변환, 캐스팅 shcho.pe.kr.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
변수와 자료형.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
기초C언어 제3주 C프로그램 구성요소, 변수와 자료형 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원
컴퓨터 프로그래밍 기초 - 2nd : scanf(), printf() 와 연산자 -
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
7장 배열 배열의 정의 배열의 초기화 1차원 배열 2차원 및 다차원 배열 문자 배열 배열과 구조.
변수와 자료형.
C언어 프로그래밍의 이해 Ch05. 명령문 Phylogenetic: 계통, 발생(학)의.
Chapter 3 Flow of Control
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
4주차: Data Types and Functions
5장. 상수와 기본 자료형. 5장. 상수와 기본 자료형 5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자.
프로그래밍 원리 Chapter 05 자바스크립트 기초 신한대학교 IT융합공학부 박 호 균.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
Chapter 2 Lexical Elements, Operators, and the C System
제2장 데이터 및 수식.
Chapter 4 수식과 연산자.
제2장 데이터형과 표준 입출력문 문봉근.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
adopted from KNK C Programming : A Modern Approach
자전거를 배우려면 안장에 올라가 페달을 밟아라.
제 3 장 연산자 (Operators).
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 05. 상수와 기본 자료형.
프로그래밍 원리 Chapter 04 자료 처리와 연산자 신한대학교 IT융합공학부 박 호 균.
Chapter 04 자료 유형.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
Chapter 11. 배열과 포인터.
Chapter 04. 데이터의 표현과 연산(Ⅱ).
Chapter 05. 입출력 함수.
Chapter 4 변수 및 바인딩.
제 3장 데이터형과 연산자 Hello!! C 언어 강성호 김학배 최우영.
학습목표 Chapter 2-1. 변수와 포인터 변수의 선언과 변수에 대한 메모리 할당을 살펴본다.
루프와 카운트 Looping and counting
연산자Operators C언어의 기본 구조 도서출판 한산 C언어의 기본 구조 1: #include <stdio.h>
6장 반복제어문 for 문 while 문 do while 문 기타 제어문.
Part 06 세상을 변화시키는 연산자 안산1대학 디지털정보통신과 임 성 국.
박성진 컴퓨터 프로그래밍 기초 [04] 연산자 박성진
누구나 즐기는 C언어 콘서트 제2장 기초 사항 IT응용시스템공학과 김형진 교수.
C언어 프로그래밍의 이해 Ch05. 명령문.
-Part1- 제6장 자료형이란 무엇인가.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
3주차: Control Flow and Others
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
C.
printf("Global Korea\n");
Presentation transcript:

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 콤마 연산자 4.10 그 외의 연산자 4.11 연산 우선 순위와 결합성 4.12 요약 4.13 예제

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

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

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;

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바이트라 가정)

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

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

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 + -20 / 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 에러 - 단항 연산자 -가 이항연산자 + - * / % 보다 우선순위가 높다. - 산술 연산자는 좌결합성을 갖는다.

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)?

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

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 - 3.333 <= x + y x < x + y ('a' + 1) < c ((-i) - (5 * j)) >= (k + 1) (3 < j) < 5 (x - 3.333) <= (x + y) x < (x + y) 1(참) 0(거짓) 산술 연산자의 우선순위가 관계 연산자보다 높다. ③의 수학적 기호 그대로의 의미는 3 < j && j < 5로 표시해야 함 이때 &&(논리연산자 AND)는 <(관계 연산자)보다 우선순위가 낮다. ⑤ 에서는 기계 정밀도가 x와 x+y값의 차이를 표현할 수 없으므로 좌,우변을 같은 값으로 간주한다.

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

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

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이 배정된다.

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(참) 동등 연산자는 산술 연산자보다 연산 우선순위가 낮다.

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

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 || 13.77 !(2 * (x + a) – 3 – ‘z’) 3 && (-2 * a + 7) (2) 틀린 예 a && /* &&뒤에 수식이 없음 */ a | b /* |는 비트별 연산자 */ a | | b /* |와 | 사이에 공백 없어야 됨 */ &a /* a의 주소(address)를 나타냄 */ a != b /* !=는 not equal로 논리연산자가 아님 */

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 논리 연산자는 좌결합성을 갖는다. 논리 연산자는 산술, 관계, 동등 연산자보다 연산 우선순위가 낮다.

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 에러

prog4-10.c short-circuit식 평가 [해 설] 4.4 논리 연산자 1 /* File : prog4-10.c 2 합선(short-circuit) 식 평가 */ 3 int main(void) 4 { 5 int den = 0, num = 5; 6 if (den == 0 || num / den == 0) 7 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가 먼저 평가될 수도 있음.

표 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 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0

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

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

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 01011010 00101101 10110100 11110110 11111111 00000111 이동 없음 우로 1번 이동 우로 3번 이동 우로 5번 이동 (Q) 이동된 나머지 좌측 비트들에는 무엇이 채워지는가? unsigned형인 경우: 0이 채워진다. signed형인 경우 위 같이 부호비트를 채우는 시스템(산술 이동)도 있고 0으로 채우는 시스템(논리 이동)도 있다.

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

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 이동 연산자는 좌결합성을 갖는다. 이동 연산자(>>)의 우선 순위는 산술 연산자(*)보다 낮다. 이동 연산자의 우선 순위는 관계 연산자(<)보다 높다. 관계 연산자(<)의 우선 순위는 논리 연산자(&&)보다 높다. 동등연산자(==)의 우선순위는 논리 연산자(&&)보다 높다.

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

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] /= 5 + 7 /* a[i] = a[i] / (5 + 7) */

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 형식에 맞지 않음 배정 연산자는 산술 연산자보다 연산 우선 순위가 낮다. 배정 연산자는 우결합성을 갖는다.

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;

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이 다른 형이면 (평가여부와 상관없이) 무조건 형 변환이 일어난다.

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

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)’ */ 감소 연산자의 경우도 마찬가지다.

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

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

4.8 증가, 감소 연산자 (예 4.21) 증가,감소 연산자의 연산 우선 순위와 결합성 [선언 및 배정] [해 설] 4.8 증가, 감소 연산자 (예 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 증가, 감소 연산자의 우선 순위는 단항 연산자 –와 같다. 증가, 감소 연산자는 우결합성을 갖는다.

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;

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

4.10 그 외의 연산자 형 변환(cast) 연산자 (예 4.23) cast 연산자의 사용 예 (자료형_이름) 수식 4.10 그 외의 연산자 형 변환(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);

4.10 그 외의 연산자 sizeof 연산자 (1) sizeof(수식) (2) sizeof(자료형_이름) 4.10 그 외의 연산자 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) */

4.10 그 외의 연산자 포인터 조작 연산자 *와 & (예 4.25) 포인터 조작 연산자의 예 4.10 그 외의 연산자 포인터 조작 연산자 *와 & *는 포인터 변수가 가리키는 내용 &는 자료의 주소 (예 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’ */

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

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

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

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

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

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

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

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

4.13 예 제 (예제 4.8) 다음 각 배정문의 의미는 무엇인가? unsigned int portset = 1543; 4.13 예 제 (예제 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진수로 11111111임

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

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