쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express.

Slides:



Advertisements
Similar presentations
Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
Advertisements

6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
연산자와 표현식 C H A P T E R 3. 소개 C 에는 많은 내장 연산자가 있다 프로그램에서 연산자는 데이터와 변수 조작에 사용 C 연산자의 분류 1. 산술 연산자 2. 관계 연산자 3. 논리 연산자 4. 대입 연산자 5. 증가 감소 연산자 6. 조건 연산자 7.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express Slide 1 (of 34)
/ 4강_연산자 4-1 할당연산자 4-2 사칙연산자 및 나머지 연산자 4-3 자동증감 연산자 4-4 비교 연산자 4-5 논리 연산자 4-6 부정 연산자 4-7 복합대입 연산자 /
Chapter 03. 데이터의 표현과 연산(Ⅰ).
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Chapter 7. 조건문.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
자료 구조: Chapter 3 (2)구조체, 포인터
쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
Chapter 04 C 연산자의 이해.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Part 05 순수한 연산자 ©우균, 창병모 © 우균, 창병모.
6장. printf와 scanf 함수에 대한 고찰
14장. 포인터와 함수에 대한 이해.
두근두근 파이썬 수업 3장 계산해봅시다..
C#.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
3장. 데이터의 표현과 컴퓨터 연산 다루는 내용 진법과 진법 변환 연산과 보수 데이터의 표현 산술 연산 논리 연산.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
JA A V W. 03.
어서와 C언어는 처음이지 제14장.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
Lesson 4. 수식과 연산자.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
상수와 기본 자료형.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
연산자 (Operator).
2장. 변수와 타입.
컴퓨터 프로그램 제2,3장 간단한 C 프로그램 김 문 기.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
Chapter 02. 자바 기본 문법.
8주차: Strings, Arrays and Pointers
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
1. 2진 시스템.
복습.
Chapter 07 비트와 여러 연산자.
3강. 컴퓨터와의 기본적인 소통수단 - I 연산자란? 컴퓨터와 소통하기 위한 다양한 방법들
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
에어 PHP 입문.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
2장 PHP 기초 PHP의 시작과 끝을 이해한다. 주석문에 대하여 이해한다. echo 문을 이용하여 화면에 출력하
SPL3D Printer If 조건문.
복습.
제 22 강 논리식 및 논리 값 shcho.pe.kr.
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
제 3장 연 산 자 연 산 자 의 종 류 연 산 자 우 선 순 위 형 변 환.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제5장 수식과 연산자 C Express

이번 장에서 학습할 내용 * 수식과 연산자란? * 대입 연산 * 산술 연산 * 논리 연산 * 관계 연산 * 비트 연산 * 우선 순위와 결합 법칙

수식의 예

수식 * 수식(expression) x + y x*x + 5*x + 6 (principal * interest_rate * period) / 12.0 수식(expression) 상수, 변수, 연산자의 조합 연산자(operator)와 피연산자(operand)로 나누어진다. 3.14 * radius 피연산자 연산자 피연산자

기능에 따른 연산자의 분류 연산자의 분류 연산자 의미 대입 = 오른쪽을 왼쪽에 대입 산술 + - * / % 사칙연산과 나머지 연산 부호 + -   증감 ++ -- 증가, 감소 연산 관계 > < == != >= <= 오른쪽과 왼쪽을 비교 논리  && || ! 논리적인 AND, OR 조건 ?: 조건에 따라 선택 콤마 , 피연산자들을 순차적으로 실행 비트 단위 연산자 & | ^ ~ << >> 비트별 AND, OR, XOR, 이동, 반전 sizeof 연산자 sizeof 자료형이나 변수의 크기를 바이트 단위로 반환 형변환 (type) 변수나 상수의 자료형을 변환 포인터 연산자 * & [] 주소계산, 포인터가 가리키는 곳의 내용 추출 구조체 연산자 .  -> 구조체의 멤버 참조

피연산자 수에 따른 연산자 분류 단항 연산자(unary operator): 피연산자가 1개 +x; -y; 이항 연산자(binary operator): 피연산자가 2개 x + y x - y 삼항 연산자(ternary operator): 피연산자가 3개 x ? y : z

산술 연산자 덧셈, 뺄셈, 곱셈, 나눗셈 등의 사칙 연산을 수행하는 연산자 y = m*x + b 기호 의미 예 덧셈 + x와 y를 더한다 x + y 뺄셈 - x에서 y를 뺀다. x – y 곱셈 * x와 y를 곱한다. x * y 나눗셈 / x를 y로 나눈다. x / y 나머지 % x를 y로 나눌 때의 나머지값 x % y y = m*x + b y = a*x*x + b*x +c m = (x + y + z) / 3 (참고) 거듭 제곱 연산자는? C에는 거듭 제곱을 나타내는 연산자가 없다. x * x 와 같이 표현

4 7 예제 x y #include <stdio.h> int main() { int x, y, result; printf("두개의 정수를 입력하시오: "); scanf("%d %d", &x, &y); result = x + y; // 덧셈 연산 printf("%d + %d = %d\n", x, y, result); result = x - y; // 뺄셈 연산 printf("%d - %d = %d\n", x, y, result); result = x * y; // 곱셈 연산 printf("%d * %d = %d\n", x, y, result); result = x / y; // 나눗셈 연산 printf("%d / %d = %d\n", x, y, result); result = x % y; // 나머지 연산 printf("%d %% %d = %d\n", x, y, result); return 0; } x y 두개의 정수를 입력하시오: 7 4 7 + 4 = 11 7 - 4 = 3 7 * 4 = 28 7 / 4 = 1 7 % 4 = 3

나눗셈 연산자 정수형끼리의 나눗셈에서는 결과가 정수형으로 생성되고 부동소수점형끼리는 부동소수점 값이 생성된다. 정수형끼리의 나눗셈에서는 소수점 이하는 버려진다. 형변환에서 자세히 학습합니다.

나눗셈 연산자 int main() { double x, y; printf("두개의 실수를 입력하시오: "); scanf("%lf %lf", &x, &y); printf("%f + %f = %f\n", x, y, x + y); printf("%f - %f = %f\n", x, y, x - y); printf("%f * %f = %f\n", x, y, x * y); printf("%f / %f = %f\n", x, y, x / y); return 0; } 두개의 실수를 입력하시오: 7 4 7.000000 + 4.000000 = 11.000000 7.000000 - 4.000000 = 3.000000 7.000000 * 4.000000 = 28.000000 7.000000 / 4.000000 = 1.750000

나머지 연산자 나머지 연산자(modulus operator)는 첫 번째 피연산자를 두 번째 피연산자로 나누었을 경우의 나머지를 계산 10 % 2는 0이다. 5 % 7는 5이다. 30 % 9는 3이다. 나머지 연산자를 이용한 짝수와 홀수를 구분 x % 2가 0이면 짝수 나머지 연산자를 이용한 5의 배수 판단 x % 5가 0이면 5의 배수 아주 유용한 연산자 입니다.

나머지 연산자 1 10 70 60 // 나머지 연산자 프로그램 #include <stdio.h> #define SEC_PER_MINUTE 60  // 1분은 60초 int main(void) {        int input, minute, second;        printf("초 단위의 시간을 입력하시오: ");        scanf("%d", &input);         // 초 단위의 시간을 읽는다.         minute = input / SEC_PER_MINUTE; // 몇 분        second = input % SEC_PER_MINUTE; // 몇 초        printf("%d초는 %d분 %d초입니다.\n", input, minute, second);        return 0; } 60 SEC_PER_ MINUTE 70 1 10 input minute second 초 단위의 시간을 입력하시오: 70 70초는 1분 10초 입니다.

+. -는 이항 연산자이기도 하고 단항 연산자이기도 하죠. 부호 연산자 변수나 상수의 부호를 변경   x = -10;   y = -x;   // 변수 y의 값은 10이 된다. +. -는 이항 연산자이기도 하고 단항 연산자이기도 하죠. 10 - 20 - 10 이항연산자 단항연산자 -10 10 -x x y

증감 연산자 x = 10; y = ++x; // x : 11, y : 11 의미 ++x x값을 먼저 증가한 후에 다른 연산에 사용한다. 이 수식의 값은 증가된 x값이다. x++ x값을 먼저 사용한 후에 증가한다. 이 수식의 값은 증가되지 않은 원래의 x값이다. --x x값을 먼저 감소한 후에 다른 연산에 사용한다. 이 수식의 값은 감소된 x값이다. x-- x값을 먼저 사용한 후에 감소한다. 이 수식의 값은 감소되지 않은 원래의 x값이다. x = 10; y = ++x; // x : 11, y : 11 x = 10; y = x++; // x : 11, y : 10 x = 10; y = --x; // x : 9, y : 9 x = 10; y = x--; // x : 9, y : 10

예제: 증감 연산자 11 11 #include <stdio.h> int main(void) { int x = 10, y = 10; printf("x = %d\n", x); printf("++x의 값: %d\n", ++x); printf("x = %d\n\n", x); printf("y = %d\n", y); printf("y++의 값: %d\n", y++); return 0; } 11 11 x = 10 ++x의 값: 11 x = 11 y = 10 y++의 값: 10 y = 11

대입(배정, 할당) 연산자 30 2 10 10 + 10 = * 10 왼쪽에 있는 변수에 오른쪽의 수식의 값을 계산하여 대입 x 변수(variable) = 수식(expression); x = 10;     // 상수 10을 변수 x에 대입 y = x;          // 변수 x의 값을 변수 y에 대입 z = 2 * x + y;  // 수식 2 * x + y를 계산하여 변수 z에 대입 30 2 10 10 + 10 = * 10 x y z

대입 연산자 주의점 1 11 10 x 왼쪽에는 항상 변수가 와야 한다. 다음의 문장은 수학적으로는 올바르지 않지만 C에서는 가능. x = x + 1; // x의 값을 1 증가 1 11 + = 10 x

y = 10 + ( x = 2 + 7 ); 대입 연산의 결과값 대입 연산도 결과값이 있습니다. 덧셈연산의 결과값은 9 대입연산의 결과값은 9 덧셈연산의 결과값은 19 대입연산의 결과값은 19 (현재는 사용되지 않음)

대입 연산의 결과값 y = x = 3; 3 3 y = x = 3 3 3

예제 수식 x+1의 값은 2 수식 y=x+1의 값은 2 수식 y=10+(x=2+7)의 값은 19 수식 y=x=3의 값은 3 /* 대입 연산자 프로그램 */ #include <stdio.h> int main(void) {         int x = 1, y;         printf("수식 x+1의 값은 %d\n", x+1);         printf("수식 y=x+1의 값은 %d\n", y=x+1);         printf("수식 y=10+(x=2+7)의 값은 %d\n", y=10+(x=2+7));         printf("수식 y=x=3의 값은 %d\n", y=x=3);                  return 0; } 수식 x+1의 값은 2 수식 y=x+1의 값은 2 수식 y=10+(x=2+7)의 값은 19 수식 y=x=3의 값은 3

복합 대입 연산자 복합 대입 연산자란 +=처럼 대입연산자 =와 산술연산자를 합쳐 놓은 연산자 소스를 간결하게 만들 수 있음 의미 x += y x = x + y x -= y x = x - y x *= y x = x * y x /= y x = x / y x %= y x = x % y x &= y x = x & y x |= y x = x | y x ^= y x = x ^ y x >>= y x = x >> y x <<= y x = x << y x op= y  x = x op (y) x += 1             // x = x + 1 x *= y + 1        // x = x * (y + 1) x %= x + y        // x = x % (x + y)

복합 대입 연산자 x = 11 y = 20 z = 2 // 복합 대입 연산자 프로그램 #include <stdio.h> int main(void) {         int x = 10, y = 10, z = 33;          x += 1;       // x = x + 1;         y *= 2;        // y = y * 2;         z %= x + y;    // z = z % (x + y ); z = 33 % (31);         printf("x = %d    y = %d    z = %d\n", x, y, z);         return 0; } x = 11    y = 20    z = 2

자동으로 변환되기도 하고 사용자가 바꾸어 주기도 하죠 형변환(type conversion) 연산시에 데이터의 유형이 변환되는 것 대입연산시 형변환 자동적인 형변환 정수연산시 형변환 자동으로 변환되기도 하고 사용자가 바꾸어 주기도 하죠 (automatic/implicit conversion) 수식연산시 형변환 형변환 명시적인 형변환 (explicit conversion) (type casting)

대입 연산시의 자동적인 형변환 올림 변환(진급/승급, promotion/widening): 안전함 double f; f = 10 + 20; // f에는 30.0이 저장된다. 내림 변환(강등, demotion/narrowing): 위험함, 정보 손실 가능 int i; i = 3.141592;            // i에는 3이 저장된다. 10+20 30 30.0 = 3 3.141592 대입 연산 대입 연산 f i

올림 변환과 내림 변환 #include <stdio.h> int main(void) {         char c; int i; float f;                  c = 10000;             // 내림 변환         i = 1.23456 + 10;     // 내림 변환         f = 10 + 20;           // 올림 변환         printf("c = %d, i = %d, f = %f\n", c, i, f); return 0; } c = 16, i = 11, f = 30.000000 …: warning C4305: '=' : 'int'에서 'char'(으)로 잘립니다. …: warning C4244: '=' : 'double'에서 'int'(으)로 변환하면서 데이터가 손실될 수 있습니다.

정수 연산시의 자동적인 형변환 20 10 20 10 x y x y + + 30 z 정수 연산시 char형이나 short형의 경우, 자동적으로 int형으로 변환하여 계산한다.  정수 진급(integral promotion) char x = 10; short y = 20; z = x + y; 10 x 20 y 10 x 20 y + + int int char short 30 z

수식에서의 자동적인 형변환 서로 다른 자료형을 혼합하여 사용하는 경우, 더 큰 자료형으로 통일된다. int형이 double형으로 승급된다. 10 1.2345 10.0 1.2345 + + int double double double 전체수식의 결과값도 double형이 된다 . 11.2345 double

명시적인 형변환 사용자가 데이터의 타입을 변경하는 것 형변환 연산자(cast operator) 사용 (int) 1.23456 (double) x // double형으로 변환 (long) (x+y) // long형으로 변환 (자료형) 상수 또는 변수 1.23456 1 (int)

예제 int i; double f; f = 5 / 4; // f = 1.0 (1  1.0) f = (double)(5 / 4); // f = 1.0 (1  1.0) f = (double)5 / 4;            // f = 1.25 (5.0 / 4  5.0 / 4.0  1.25) f = 5 / (double)4;            // f = 1.25 (5 / 4.0  5.0 / 4.0  1.25) f = (double)5 / (double)4; // f = 1.25 (5.0 / 4.0  1.25) i = 1.3 + 1.8;                // i = 3 (3.1  3) i = (int)1.3 + (int)1.8;    // i = 2 (1 + 1  2)

관계 연산자 피연산자의 크기 비교 결과값은 참(1) 아니면 거짓(0): 참인 경우 결과값은 항상 1 연산자 의미 사용 예 == x와 y가 같은가? x == y != x와 y가 다른가? x != y > x가 y보다 큰가? x > y < x가 y보다 작은가? x < y >= x가 y보다 크거나 같은가? x >= y <= x가 y보다 작거나 같은가? x <= y

예제 #include <stdio.h> int main(void) { int x, y; printf("두개의 정수를 입력하시오: "); scanf("%d %d", &x, &y); printf("x == y: %d\n", x == y); printf("x != y: %d\n", x != y); printf("x > y : %d\n", x > y); printf("x < y : %d\n", x < y); printf("x >= y: %d\n", x >= y); printf("x <= y: %d\n", x <= y); return 0; } 두개의 정수를 입력하시오: 3 4 x == y: 0 x != y: 1 x > y : 0 x < y : 1 x >= y: 0 x <= y: 1

논리 연산자 여러 개의 조건을 조합하여 참과 거짓을 따지는 연산자 결과값은 참(1) 아니면 거짓(0) : 참인 경우 결과값은 항상 1 연산자 사용 예 의미 && x && y AND 연산; x와 y가 모두 참이면 참, 그렇지 않으면 거짓 || x || y OR 연산; x나 y가 참이면 참, 모두 거짓이면 거짓 ! !x NOT 연산; x가 참이면 거짓, x가 거짓이면 참 x y x && y x || y 참 거짓

0이 아닌 값을 참으로 취급하지만 논리 연산의 결과값은 항상 1 또는 0입니다. 참과 거짓의 표현 방법 관계 연산과 논리 연산의 결과값: 참이면 1, 거짓이면 0 논리 연산에서 참/거짓의 판단 0이면 거짓, 0이 아니면 모두 참으로 판단 음수도 참 0이 아닌 값을 참으로 취급하지만 논리 연산의 결과값은 항상 1 또는 0입니다. !0    // 결과값은 1 !3            // 결과값은 0 !-3        // 결과값은 0 x  x != 0 !x  x == 0 X && !y  (x != 0) && (y == 0) if (x)  if (x != 0) if (!x)  if (x == 0)

논리 연산 예 age = 27; toeic = 800; (age <= 30) && (toeic >= 700) // 참(1) (age <= 30) && (toeic >= 900) // 거짓(0) age = 27; toeic = 699; (age <= 30) || (toeic >= 700) // 참(1) (age <= 20) || (toeic >= 700) // 거짓(0) result = !2; // result = 0 result = !(2==3); // result = 1

논리 연산 예 x는 1, 2, 3중의 하나이다. (x == 1) || (x == 2) || (x == 3)

예제 #include <stdio.h> int main(void) { int x, y; printf(“두 정수를 입력하시오: "); scanf("%d %d", &x, &y); printf("%d && %d의 결과값: %d\n", x, y, x && y); printf("%d || %d의 결과값: %d\n", x, y, x || y); printf("!%d의 결과값: %d\n", x, !x); return 0; } 두 정수를 입력하시오: 1 0 1 && 0의 결과값: 0 1 || 0의 결과값: 1 !1의 결과값: 0

관계 연산자 사용시 주의점 x 와 y가 같은가? (X) x = y  대입 연산 (O) x == y (O) (2 < x) && (x < 5)

윤년 판단 예제 윤년의 조건 연도가 4로 나누어 떨어진다. 100으로 나누어 떨어지는 연도는 제외한다. 400으로 나누어 떨어지는 연도는 윤년이다. ( (year % 4 == 0 ) && (year % 100 != 0) ) || (year % 400 == 0) 연도를 입력하시오: 2012 result = 1

윤년 판단 예제 // 윤년 프로그램 #include <stdio.h> int main(void) { int year, result; printf("연도를 입력하시오: "); scanf("%d", &year); result = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); printf("result = %d\n", result); return 0; } 연도를 입력하시오: 2012 result = 1

단축 계산(short-circuit evaluation) && : 첫번째 피연산자가 거짓이면 두번째 피연산자는 계산하지 않음   ( 2 > 3 ) && ( ++x < 5 ) || : 첫번째 피연산자가 참이면 두번째 피연산자는 계산하지 않음   ( 3 > 2 ) || ( --x < 5 ) ++나 --는 실행되지 않을 수도 있으니 주의하세요. 첫번째 피연산자가 거짓이면 두번째 피연산자는 계산할 필요가 없겠군!!

조건 연산자 absolute_value = (x > 0) ? x : -x; // 절댓값 계산 max_value = (x > y) ? x : y; // 최댓값 계산 min_value = (x < y) ? x : y; // 최솟값 계산 (age > 20) ? printf("성인\n") : printf("청소년\n");

예제 첫번째 수 = 두번째 수 = 큰 수 = 3 작은 수 = 2 2 3 #include <stdio.h> int main(void) {         int x, y;         printf("첫번째 수 = ");         scanf("%d", &x);         printf("두번째 수 = ");         scanf("%d", &y);         printf("큰 수 = %d\n", (x > y) ? x : y);         printf("작은 수 = %d\n", (x < y) ? x : y); }       첫번째 수 = 두번째 수 = 큰 수 = 3 작은 수 = 2 2 3

콤마 연산자 콤마로 연결된 수식은 순차적으로 계산된다. 결과값은 두번째 피연산자의 계산값 x = 1, y = x + 2; // x = 1, y = 3 z = (x++, y++); // x = 2, y = 4, z = 3 last = (1, 2, 3); // last = 3 // 1, 2, 3  (1, 2), 3  2, 3  3 first = 1, 2; // first = 1 // (first = 1), 2  1, 2  2(not used)

비트 연산자 연산자 의미 설명 & 비트 AND 두 피연산자의 해당 비트가 모두 1이면 1, 아니면 0 | 비트 OR 두 피연산자의 해당 비트 중 하나라도 1이면 1, 아니면 0 ^ 비트 XOR 두 피연산자의 해당 비트 값이 같으면 0, 아니면 1 << 좌측 이동 지정된 개수만큼 모든 비트를 왼쪽으로 이동 >> 우측 이동 지정된 개수만큼 모든 비트를 오른쪽으로 이동 ~ 비트 NOT 0은 1로, 1은 0으로 바꿈 (결과: 1의 보수)

& : 비트 AND 연산자 0 AND 0 = 0 1 AND 0 = 0 0 AND 1 = 0 1 AND 1 = 1

| : 비트 OR 연산자 0 OR 0 = 0 1 OR 0 = 1 0 OR 1 = 1 1 OR 1 = 1

^ : 비트 XOR 연산자 XOR(eXclusive OR): 배타적 논리합 x ^ y ^ y  x 0 XOR 0 = 0

~ : 비트 NOT 연산자 결과값: 1의 보수 NOT 0 = 1 NOT 1 = 0

예제: 비트 연산자 #include <stdio.h> int main(void) { int x = 9; // 1001 int y = 10; // 1010 printf("비트 AND = %08X\n", x & y); // 00001000 printf("비트 OR = %08X\n", x | y); // 00001011 printf("비트 XOR = %08X\n", x ^ y); // 00000011 printf("비트 NOT = %08X\n", ~x ); // 11110110 return 0; } 비트 AND = 00000008 비트 OR = 0000000B 비트 XOR = 00000003 비트 NOT = FFFFFFF6

<< : 좌측 이동(shift left) 연산자 우측에 0으로 채움 x << n  x * 2n x: 00000000 00000000 00000000 00000110 (6) x << 3: 00000000 00000000 00000000 00110000 (48)

>> : 우측 이동(shift right) 연산자 signed: 산술적 이동(arithmetic shift), 좌측에 부호 비트로 채움 unsigned: 논리적 이동(logical shift), 좌측에 무조건 0으로 채움 x >= 0 인 경우: x >> n  x / 2n x: 00000000 00000000 00000000 00001010 (10) x >> 2: 00000000 00000000 00000000 00000010 (2) int x = -13; // x >> 2 : -4 x: 11111111 11111111 11111111 11110011 (-13) x >> 2: 11111111 11111111 11111111 11111100 (-4) unsigned x = 0xFFFFFFF3; // x >> 2 : 0x3FFFFFFC x: 11111111 11111111 11111111 11110011 x >> 2: 00111111 11111111 11111111 11111100

예제: 비트 이동 연산자 #include <stdio.h> int main(void) { int x = 4; // 0100 printf("비트 << = %#010x\n", x << 1); // 1000 printf("비트 >> = %#010x\n", x >> 1); // 0010 return 0; } 비트 << = 0x00000008 비트 >> = 0x00000002

픽셀 표현 예제 ARGB 타입의 32비트 이미지 픽셀 형식 빨강색 성분 추출 AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB 예: 빨강색 0000 0000 1111 1111 0000 0000 0000 0000 빨강색 성분 추출 color : AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB mask : 0000 0000 1111 1111 0000 0000 0000 0000 & ----------------------------------------- result : 0000 0000 RRRR RRRR 0000 0000 0000 0000 mask = 0x00FF0000 shift : >> 16 >> ----------------------------------------- result : 0000 0000 0000 0000 0000 0000 RRRR RRRR

픽셀 표현 예제 #include <stdio.h> int main(void) { unsigned int color = 0x00380000; // 픽셀의 색상 unsigned int result; result = color & 0x00ff0000; // 마스크 연산 result = result >> 16; // 비트 이동 연산 printf("픽셀의 색상 = %#08x\n", color); Printf(“추출된 빨강색 = %#08x\n", result); return 0; } 픽셀의 색상 = 0x00380000 추출된 빨강색 = 0x00000038

우선순위 어떤 연산을 먼저 수행할 것인지에 대한 규칙

우선순위 우선 순위 연산자 결합 규칙 1 () [] -> . ++(후위) --(후위) ->(좌에서 우) 2 (단항) sizeof &(주소) ++(전위) --(전위) ~ ! *(역참조) +(부호) -(부호), 형변환 <-(우에서 좌) 3 *(곱셈) / % 4 +(덧셈) -(뺄셈) 5 << >> 6 < <= >= > 7 == != 8 &(비트연산) 9 ^ 10 | 11 && 12 || 13 ?:(조건, 삼항) 14 = += *= /= %= &= ^= |= <<= >>= 15 ,(콤마)

우선순위의 일반적인 지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 연산자들의 우선순위가 생각나지 않으면 괄호를 이용 (x <= 10) && (y >= 20) 관계 연산자나 논리 연산자는 산술 연산자보다 우선순위가 낮다. x + 2 == y + 3  (x + 2) == (y + 3)

결합 규칙 * = = = 우선순위가 같은 경우 어떤 연산을 먼저 수행할 것인지에 대한 규칙 *와 %의 우선순위가 같으므로 왼쪽에서 오른쪽으로 연산을 수행한다. = 연산자는 오른쪽 우선 결합이므로 오른쪽부터 계산된다. 5 3 x = y = z = 5 2 * % ① ① 10 % 3 x = y = 5 ② ② x = 5 1 ③ 5

예제 1 -1 #include <stdio.h> int main(void) { int x=0, y=0; int result; result = 2 > 3 || 6 > 7; printf("%d\n", result); result = 2 || 3 && 3 > 2; result = x = y = 1; result = - ++x + y--; return 0; } 1 -1

화씨  섭씨 변환

잘못된 부분은 어디에? c_temp = 5.0 / 9.0 * (f_temp - 32); #include <stdio.h> int main(void) { double f_temp; double c_temp; printf("화씨온도를 입력하시오: "); scanf("%lf", &f_temp); c_temp = 5 / 9 * (f_temp - 32); printf("섭씨온도는 %f입니다.\n", c_temp); return 0; } 화씨온도를 입력하시오: 90 섭씨온도는 0.000000입니다. c_temp = 5.0 / 9.0 * (f_temp - 32);