Part 05 순수한 연산자 ©우균, 창병모 © 우균, 창병모
이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자 2진수를 위한 비트 연산 © 우균, 창병모
5.1 연산자와 수식 © 우균, 창병모
연산자와 수식 수식 연산자(operator) 피연산자 + - * / % > < == != >= <= 값을 나타내기 위해서 사용된 연산자들과 피연산자들의 조합 연산자(operator) 이미 정의된 산술 혹은 논리 연산을 수행하는 기호 피연산자 연산의 대상이 되는 리터럴, 상수, 변수, 혹은 다른 수식 등 종류 연산자 산술 연산자 + - * / % 관계 연산자 > < == != >= <= 논리 연산자 && || ! 증감 연산자 ++ -- 비트 연산자 & | ^ ~ << >> © 우균, 창병모
연산자 피연산자 수에 따라 ++ -- ! & * + - sizeof(형) 단항연산자(unary operator): 하나의 피연산자에 대해 연산 이항연산자 (binary operator): 두 개의 피연산자에 대해 연산 분류 연산자 단항 연산자 ++ -- ! & * + - sizeof(형) 이항 연산자 + - * / % == != > < >= <= && || & | ^ © 우균, 창병모
5.2 산술 연산자 © 우균, 창병모
산술 연산자 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%) 연산 정수형과 부동소수형에 대해서 가능 연산 피연산자 자료형 결과 값 단항 플러스 +a 정수형, 부동소수형 a의 값 그대로 단항 마이너스 -a a의 부호를 변경한 값 덧셈 a + b a와 b의 합 뺄셈 a - b a에서 b를 뺀 값 곱셈 a * b a와 b의 곱 나눗셈 a / b 정수형 a를 b로 나눈 몫 부동소수형 a를 b로 나눈 값 나머지 a % b a를 b로 나눈 나머지 © 우균, 창병모
나머지 연산(remainder operation) 정수에 대한 나머지 연산 첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지 정수 값 예 14 % 3 = 2 -20 % 6 = -2 10 % -3 = 1 2 % 7 = 2 © 우균, 창병모
arithmetic.c 실행결과: 145 + 20 = 165 145 - 20 = 125 145 * 20 = 2900 145 / 20 = 7 145 % 20 = 5 © 우균, 창병모
부동소수형 연산 이항 산술연산자 예를 들어 주의 두 개의 피연산자가 모두 정수형이면 결과도 정수형 한 개 이상의 피연산자가 부동소수형이면 그 결과는 부동소수형 예를 들어 2 + 3.14 ⇒ 2.0 + 3.14 = 5.14 12.0/5 ⇒ 12.0/5.0 = 2.4 주의 정수 나눗셈의 결과는 정수 값이 되고 부동소수형 나눗셈의 결과는 부동소수점 값이 된다. © 우균, 창병모
conversion.c 실행결과: 화씨온도를 입력하세요 62 화씨온도 62도는 섭씨온도 16.666666도입니다 © 우균, 창병모
연산자 우선순위 연산자 우선순위 괄호를 이용한 연산 순서 조정 한 수식 내에서 연산자의 계산 순서 수식을 계산할 때 괄호로 묶인 수식은 먼저 수행된다. (fahrenheit - BASE) * 5.0 / 9.0 vs fahrenheit - BASE * 5.0 / 9.0 우선순위 연산자 1순위 단항 + 단항 - 2순위 * / % 3순위 + - 산술 연산자 우선순위 © 우균, 창병모
결합순서(associativity) 좌우선 결합(left associative) 우우선 결합(right associative) 우선순위가 같은 이항 산술연산자들은 좌측에서 우측 순서로 계산한다 예 a / b * c (a / b) * c 우우선 결합(right associative) 단항 산술연산자는 우측에서 좌측 순서로 계산한다 - + - a - (+ (- a)) © 우균, 창병모
circle.c 실행결과: 원의 반지름을 입력하세요 10 원의 둘레: 62.800003 원의 면적: 314.000000 © 우균, 창병모
5.3 형 변환 © 우균, 창병모
묵시적 형 변환 질문? 묵시적 형 변환 만일, 2 * 1.5를 계산하면 어떻게 될까 ? int * double과 같이 서로 다른 형의 값을 곱하면 어떻게 될까? 결과는 int 형이 될까 아니면 double 형이 될까 ? 묵시적 형 변환 서로 다른 형의 혼합연산을 하면 필요한 기억장소의 크기가 작은 쪽에서 큰 쪽으로 묵시적으로 확장 변환(widening conversion) 변수 내의 값 자체는 변화가 없고, 단지 그 값을 계산할 때 변환해서 사용. 주의 ! © 우균, 창병모
확장 변환(widening conversion) 자료형의 값을 저장하는 데 필요한 기억장소의 크기가 같거나 큰 다른 자료형으로 변환 char(1) < short(2) < int(4) ≤ long(4) ≤ float(4) < double(8) ≤ long double(8) 수식에서 여러 타입이 사용되면 자동 확장 변환이 일어난다. 확장 변환 예 int won, rate = 960; float dollar; won = dollar * rate; © 우균, 창병모
대입 변환(assignment conversion) 어떤 형의 값이 다른 형의 변수에 대입될 때 자동적으로 일어나며, 이 과정에서 값이 대입될 변수 형으로 자동 변환된다. 예 dollar = won / rate; won / rate 값이 36이면, 부동소수점 값 36.0으로 변환 후 dollar에 대입 축소 변환(narrowing conversion) won = dollar * rate; 소숫점 이하 값은 버리고 정수 값만 대입한다. 축소 변환은 정보를 손실시키므로 주의! © 우균, 창병모
명시적 형 변환 타입 캐스팅은 명시적으로 형을 변환하는 방법이다. 타입 캐스팅 형식 예를 들어 (형 이름) 변수 혹은 수식 타입 캐스팅은 명시적으로 형을 변환하는 방법이다. 타입 캐스팅 형식 (형 이름) 변수 혹은 수식 예를 들어 dollar = (float) won / rate; 캐스트 연산자가 나눗셈 연산자보다 우선순위가 높다 캐스트가 won의 값에 먼저 적용되어 won 값의 부동소수점 버전을 반환 rate가 산술 확장 변환을 통해서 부동 소수점 값으로 변환 나눗셈 연산자는 부동 소수점 나눗셈을 수행 © 우균, 창병모
명시적 형 변환 예 달러를 원으로 변환하는 경우 주의 won = (int) (dollar * rate); 묵시적 형 변환 혹은 캐스팅은 대상이 되는 변수나 수식 값 자체를 변경하지 않는다. © 우균, 창병모
exchange.c 실행결과: won: 35000 dollar: 36.0000 won: 35000 dollar: 36.4583 © 우균, 창병모
5.4 관계 연산자 © 우균, 창병모
관계 연산자 C 언어의 관계 연산자 두 값의 동치 관계나 두 값 간의 대소 관계를 비교한다. 연산 연산자 자료형 결과값 같다 a == b 정수형, 부동소수형 a 값과 b 값이 같으면 1(참) 그렇지 않으면 0(거짓) 다르다 a != b a 값과 b 값이 같지 않으면 1(참) 그렇지 않으면 0(거짓) 작다 a < b a 값이 b 값보다 작으면 1(참) 그렇지 않으면 0(거짓) 작거나 a <= b a 값이 b 값보다 작거나 같으면 1(참) 그렇지 않으면 0(거짓) 크다 a > b a 값이 b 값보다 크면 1(참) 그렇지 않으면 0(거짓) 크거나 a >= b a 값이 b 값보다 크거나 같으면 1(참) 그렇지 않으면 0(거짓) © 우균, 창병모
relation.c 실행결과: (10 > 11) = 0 (10 >= 11) = 0 (10 == 11) = 0 (10 > 11) = 0 (10 >= 11) = 0 (10 == 11) = 0 (10 != 11) = 1 (10 < 11) = 1 (10 <= 11) = 1 © 우균, 창병모
관계 연산자 관계 연산은 산술 연산보다 우선순위가 낮다. if 문이나 while 문의 조건 a + b > 0 int val, abs_val; ... if (val > 0) abs_val = val; else abs_val = -val; © 우균, 창병모
5.5 논리 연산자 © 우균, 창병모
논리 연산자 C 언어의 논리 연산자 논리 NOT 연산자(!), 논리 AND 연산자(&&), 논리 OR 연산자(||) ! a 결과 논리 NOT ! a a가 거짓이면 1(참)이고, 그렇지 않으면 0(거짓)이다. 논리 AND a && b a, b 모두 참이면 1(참)이고, 그렇지 않으면 0(거짓)이다. 논리 OR a || b a, b 중 적어도 한 개가 참이면 1(참)이고, 그렇지 않으면 0(거짓)이다. © 우균, 창병모
scoreInput.c 실행결과: 점수를 입력하세요: 80 80은 범위 내의 점수입니다. © 우균, 창병모
단락회로 계산 ~ &&와 || 연산자는 단락회로 계산(short-circuit evaluation) 을 한다 단락회로 계산 예 왼쪽 피연산자가 연산의 결과 값을 결정하는 데 충분하면, 오른쪽 피연산자는 계산하지 않는다. 예 score >= 0 && score <= 100 참 score >=0 score <=100 ~ 거짓 © 우균, 창병모
5.6 비트 연산자 © 우균, 창병모
비트 연산자 C 언어 시스템 프로그래밍 언어로 설계 다양한 비트 연산들을 제공 하드웨어를 다루는데 필요 a << n 구분 종류 연산자 자료형 결과 비트 이동 좌로 이동 (left shift) a << n 정수형 a를 n 비트만큼 좌측으로 이동하고 오른쪽 끝은 이동한 수만큼 0으로 채운다 우로 이동 (right shift) a >> n a를 n 비트만큼 우측으로 이동하고 왼쪽 끝은 이동한 수만큼 0 혹은 1로 채운다 비트 논리 비트 AND a & b a와 b의 비트 AND 값 비트 OR a | b a와 b의 비트 OR 값 비트 XOR a ^ b a와 b의 비트 XOR 값 1의 보수 연산 ~a a의 1의 보수 값 © 우균, 창병모
비트 이동 연산자 비트 이동 연산자 <<와 >> 비트 이동 예 비트를 좌로 혹은 우로 이동시키는 연산자이다. 비트 이동 예 11 = 0000 0000 0000 1011 17 = 0000 0000 0001 0001 0000 0000 0000 1011 << 2 = 0000 0000 0010 1100 = 44 0000 0000 0001 0001 >> 3 = 0000 0000 0000 0010 = 2 © 우균, 창병모
shift.c 실행결과: 11 << 2 = 44 17 >> 3 = 2 © 우균, 창병모
비트 연산자 진리표 a b a & b a | b a ^ b 1 a ~a 1 © 우균, 창병모
bit.c 실행결과: 1f05 & 31a1 = 1101 1f05 | 31a1 = 3fa5 1f05 ^ 31a1 = 2ea4 ~1f05 = ffffe0fa © 우균, 창병모
비트 연산 예 비트 연산 예 16진수 값 2진수 값 a 0x1f05 0001 1111 0000 0101 b 0x31a1 0011 0001 1010 0001 ~a 0xe0fa 1110 0000 1111 1010 a & b 0x1101 0001 0001 0000 0001 a | b 0x3fa5 0011 1111 1010 0101 a ^ b 0x2ea4 0010 1110 1010 0100 © 우균, 창병모
Key Point © 우균, 창병모
Key Point 1 수식 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 연산 정수에 대한 나머지 연산 값을 나타내기 위해서 사용된 연산자들과 피연산자들의 조합 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 연산 정수형과 부동소수형에 대해서 가능하다. 정수에 대한 나머지 연산 첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지 정수 값 정수 나눗셈의 결과는 정수 값이 되고 부동소수형 나눗셈의 결과는 부동소수점 값이 된다. 연산자 우선순위(operator priority) 한 수식 내에서 연산자의 계산 순서 수식에서 여러 타입이 사용되면 자동으로 확장 변환이 일어난다. © 우균, 창병모
Key Point 2 대입 변환 타입 캐스팅은 명시적으로 형을 변환하는 방법이다. C 언어의 관계 연산자들 어떤 형의 값이 다른 형의 변수에 대입될 때 자동으로 일어나며, 이 과정에서 값이 대입될 변수 형으로 자동 변환된다. 타입 캐스팅은 명시적으로 형을 변환하는 방법이다. C 언어의 관계 연산자들 두 값의 동치 관계나 두 값 간의 대소 관계를 비교한다. C 언어는 논리 연산자 논리 NOT 연산자(!), 논리 AND 연산자(&&), 논리 OR 연산자(||) 단락회로 계산 왼쪽 피연산자가 연산의 결과 값을 결정하는 데 충분하면, 오른쪽 피연산자는 계산하지 않는다. 비트를 좌로 혹은 우로 이동시키는 연산자 <<와 >> © 우균, 창병모
프로그래밍 실습 © 우균, 창병모
▶ 프로그래밍 실습 환율계산기 프로그램을 작성해보자. 이 프로그램은 다음과 같이 동작한다. (1) 먼저 기준 환율을 입력받는다. 1달러 기준 환율을 입력하세요: 960 (2) 메뉴를 출력한다. 1. 기준 환율 출력 2. 원화를 달러화로 변환 3. 달러화를 원화로 변환 메뉴를 선택하세요: © 우균, 창병모
▶ 프로그래밍 실습 (3.1) 1번 메뉴를 선택한 경우 (4.1) 다음과 같이 결과를 출력한다. 오늘의 기준환율은 1달러 960원입니다. (3.2) 2번 메뉴를 선택한 경우 원화를 입력하세요: 35000 (4.2) 다음과 같이 결과를 출력한다. 35000원은 36.46 달러입니다. (3.3) 3번 메뉴를 선택할 경우 달러화를 입력하세요: 120.99 (4.3) 다음과 같이 결과를 출력한다. 120.99 달러는 116150 원입니다. © 우균, 창병모