2015-1 2. 변수 (Variable) 과연산자 (Operator) March 5, 2015 Advanced Networking Technology Lab. (YU-ANTL) Dept. of Information & Comm. Eng, College of Engineering, Yeungnam University, KOREA (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr)
Outline 변수 (variable) 와상수 (constant) 자료형 (data type) 변수의선언과사용 정수형, 실수형- 부동소수점형, 문자형 기호상수 (symbol) 오버플로우 (overflow) 와언더플로우 (underflow) 수식과연산자란? 산술연산자, 대입연산자 형변환 관계연산자, 논리연산자, 조건연산자, 콤마연산자 비트단위연산자 연산자의우선순위와결합규칙 2-2
변수 (Variable) Q) 변수 (variable) 이란무엇인가? A) 프로그램에서일시적으로데이터를저장하는공간 Q) 변수는왜필요한가? A) 데이터가입력되면어딘가에저장해야만다음에사용할수있다. 78 90 56 성적들의평균을구하려면먼저성적들이어딘가에저장되어있어야함 12 평균 2-3
변수와상수 변수 (variable): 저장된값의변경이가능한공간 상수 (constant): 저장된값의변경이불가능한공간 ( 예 ) 3.14, 100, A, Hello World! 12 12 변수 상수 2-4
예제 : 변수와상수 /* 원의면적을계산하는프로그램 */ #include <stdio.h> int main(void) { 변수 double radius; double area; // 원의반지름 // 원의면적 printf(" 원의면적을입력하시요 :"); scanf("%lf", &radius); area = 3.141592 * radius * radius; printf(" 원의면적 : %lf \n", area); 상수 원의면적을입력하시요 :10 원의면적 : 314.159210 } return 0; 2-5
자료형 자료형 (data type): 데이터의타입 ( 종류 ) ( 예 ) short, int, long: 정수형데이터 (100) ( 예 ) double, float: 실수형데이터 (3.141592) ( 예 ) char: 문자형데이터 ( A, a, 한 ) char short int float double long double 2-6
예제 : 자료형의크기 #include <stdio.h> int main(void) { int x; } printf(" 변수 x의 크기 : %d", sizeof(x)); printf("char형의 크기 : %d", sizeof(char)); printf("int형의 크기 : %d", sizeof(int)); printf("short형의 크기 : %d", sizeof(short)); printf("long형의 크기 : %d", sizeof(long)); printf("float형의 크기 : %d", sizeof(float)); printf("double형의크기 : %d", sizeof(double)); return 0; 변수 x 의크기 : 4 char 형의크기 : 1 int 형의크기 : 4 short 형의크기 : 2 long 형의크기 : 4 float 형의크기 : 4 double 형의크기 : 8 2-7
자료형의종류 정수형 문자형 부호있음 부호없음 부동소수점형 자료형 설명 바이트수 short short 형정수 2-32768~32767 범위 int 정수 4-2147483648~2147483647 long long 형정수 4-2147483648~2147483647 unsigned short 부호없는 short 형정수 2 0~65535 unsigned int 부호없는정수 4 0~4294967295 unsigned long 부호없는 long 형정수 4 0~4294967295 부호있음 char 문자및정수 1-128~127 부호없음 unsigned char 문자및부호없는정수 1 0~255 float 단일정밀도부동소수점 4 1.2E-38~3.4E38 double 두배정밀도부동소수점 8 2.2E-308~1.8E308 Long double 두배정밀도부동소수점 8 2.2E-308~1.8E308 2-8
변수의이름짓기 식별자 (identifier): 식별할수있게해주는이름 변수이름 함수이름 알파벳문자와숫자, 밑줄문자 _ 로구성 첫번째문자는반드시알파벳또는밑줄문자 _ 대문자와소문자를구별 C 언어의키워드와똑같은이름은허용되지않는다. (Q) 다음은유효한식별자인가? sum _count king3 n_pictures 2nd_try Dollor# double 2-9
키워드 (Keyword) 키워드 (keyword): C 언어에서고유한의미를가지고있는특별한단어 예약어 (reserved words) 라고도한다. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while 2-10
변수선언 변수선언 : 컴파일러에게어떤변수를사용하겠다고미리알리는것 자료형변수이름 ; 변수선언의예 char c; int i; double interest_rate; int height, width; char c int i int height int width double interest_rate 2-11
변수에값을저장하는방법 char c; // 문자형변수 c 선언 int i; // 정수형변수 i 선언 double interest_rate; // 실수형변수 interest_rate 선언 c = 'a'; // 문자형변수 c에문자 'a' 를대입 i = 60; // 정수형변수 i에 60을대입 interest_rate = 4.9; // 실수형변수 interest_rate에 82.9를대입 char c a int i 7 4.9 double interest_rate 2-12
변수의초기화 자료형변수이름 = 초기값 ; 변수초기화의예 char c = a ; int i = 7; double interest_rate = 0.05; char c a int i 7 double interest_rate 0.05 2-13
변수의사용 저장된값은변경이가능하다. int value1 = 10; int value2; value2 = value1; 2-14
예제 : 변수의선언 #include <stdio.h> 변수선언 int main(void) { int usd; int krw; // 달러화 // 원화 printf(" 달러화금액을입력하시오 : "); scanf("%d", &usd); } krw = 1120 * usd; printf(" 달러화 %d달러는 %f원입니다.", usd, krw); return 0; 1120000 달러화금액을입력하시오 : 100 달러화 100 달러는 112000 원입니다. krw 1120 = ** 100 usd 2-15
정수형 (integer) short, int, long short int long 16비트 (2바이트) 32비트 (4바이트) 32비트 (4바이트) 가장기본이되는것은 int CPU에따라서크기가달라진다. 16비트, 32비트, 64비트 (Q) 왜여러개의정수형이필요한가? (A) 용도에따라프로그래머가선택하여사용할수있게하기위하여 2-16
정수형의범위 int 형 약 -21 억에서 +21 억 short 형 long 형 보통 int 형과같음 2-17
unsigned signed, unsigned 수식자 음수가아닌값만을나타냄을의미 unsigned int signed 부호를가지는값을나타냄을의미 흔히생략 2-18
오버플로우 오버플로우 (overflow): 변수가나타낼수있는범위를넘는숫자를저장하려고할때발생 #include <stdio.h> #include <limits.h> int main(void) { short s_money = SHRT_MAX; // 최대값으로초기화한다. 32767 unsigned short u_money = USHRT_MAX; // 최대값으로초기화한다. 65535 } s_money = s_money + 1; printf("s_money = %d", s_money); u_money = u_money + 1; printf("u_money = %d", u_money); return 0; 오버플로우발생!! s_money = -32768 u_money = 0 2-19
정수상수 (integer constant) 숫자를적으면기본적으로 int 형이된다. sum = 123; // 123 은 int 형 상수의자료형을명시하려면다음과같이한다. sum = 123L; // 123은 long형 접미사 자료형 예 u 또는 U unsigned int 123u 또는 123U l 또는 L long 123l 또는 123L ul 또는 UL unsigned long 123ul 또는 123UL 2-20
기호상수 (Symbolic Constant) 기호상수 (symbolic constant): 기호를이용하여상수를표현한것 ( 예 ) area = 3.141592 * radius * radius; area = PI * radius * radius; income = salary - 0.15 * salary; income = salary - TAX_RATE * salary; 기호상수의장점 가독성 (readability) 이높아진다. 값을쉽게변경할수있다. 2-21
기호상수를만드는방법 #define 기호상수이름값 ( 예 ) #define EXCHANGE_RATE 1120 const 자료형변수이름 = 초기값 ( 예 ) const int EXCHANGE_RATE = 1120; 2-22
예제 : 기호상수 #include <stdio.h> #define TAX_RATE 0.2 기호상수 int main(void) { const int MONTHS = 12; int m_salary, y_salary; // 변수선언 printf( " 월급을입력하시요 : "); // 입력안내문 scanf("%d", &m_salary); y_salary = MONTHS * m_salary; // 순수입계산 printf(" 연봉은 %d입니다.", y_salary); 월급을입력하시요 : 100 연봉은 1200 입니다. 세금은 240.000000 입니다. printf(" 세금은 %f 입니다.", y_salary*tax_rate); } return 0; 2-23
문자형 문자는컴퓨터보다는인간에게중요 문자도숫자를이용하여표현 공통적인규격이필요하다. 아스키코드 (ASCII: American Standard Code for Information Interchange) 8 비트를사용하여영어알파벳표현 ( 예 )! 는 33, A 는 65, B 는 66, a 는 97, b 는 98!"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{ }~ 2-24
아스키코드표 ( 일부 ) 2-25
문자변수 (character variable) /* 문자변수와문자상수 */ #include <stdio.h> int main(void) { char code1 = 'A'; char code2 = 65; } // 문자상수로초기화 // 아스키코드로초기화 printf(" 문자상수초기화 = %c\n", code1); printf(" 아스키코드초기화 = %c\n", code2); 문자상수초기화 = A 아스키코드초기화 = A (Q) 1 과 1 의차이점은? (A) 1 은정수상수이고 1 은문자상수이다. 2-26
제어문자 (Control Character) 인쇄목적이아니라제어목적으로사용되는문자들 ( 예 ) 줄바꿈문자, 탭문자, 벨소림문자, 백스페이스문자 제어문자를나타내는방법 아스키코드를직접사용 char beep = 7; printf("%c", beep); 이스케이프시퀀스사용 char beep = \a ; printf("%c", beep); 2-27
Escape Sequence 제어문자이름 제어문자표기 값 의미 널문자 \0 0 문자열의끝을표시 경고 (bell) \a 7 " 삐 하는경고벨소리발생 백스페이스 (backspace) \b 8 커서를현재의위치에서한글자뒤로옮긴다. 수평탭 (horizontal tab) \t 9 커서의위치를현재라인에서설정된다음탭위치로옮긴다. 줄바꿈 (newline) \n 10 커서를다음라인의시작위치로옮긴다. 수직탭 (vertical tab) \v 11 설정되어있는다음수직탭위치로커서를이동 폼피드 (form feed) \f 12 주로프린터에서강제적으로다음페이지로넘길때사용된다. 캐리지리턴 (carriage return) \r 13 커서를현재라인의시작위치로옮긴다. 큰따옴표 \ 34 원래의큰따옴표자체 작은따옴표 \ 39 원래의작은따옴표자체 역슬래시 (back slash) \\ 92 원래의역슬래시자체 2-28
수식 (Expression) 수식 (expression) x + y x*x + 5*x + 6 (principal * interest_rate * period) / 12.0 수식은상수, 변수, 연산자의조합 연산자와피연산자로나누어진다. 3.14 radius * 피연산자연산자피연산자 2-29
기능에따른연산자의분류 연산자의분류 연산자 의미 대입 = 오른쪽을왼쪽에대입 산술 + - * / % 사칙연산과나머지연산 부호 + - 증감 ++ -- 증가, 감소연산 관계 > < ==!= >= <= 오른쪽과왼쪽을비교 논리 &&! 논리적인 AND, OR 조건? 조건에따라선택 콤마, 피연산자들을순차적으로실행 비트단위연산자 & ^ ~ << >> 비트별 AND, OR, XOR, 이동, 반전 sizeof 연산자 sizeof 자료형이나변수의크기를바이트단위로반환 형변환 (type) 변수나상수의자료형을변환 포인터연산자 * & [] 주소계산, 포인터가가리키는곳의내용추출 구조체연산자. -> 구조체의멤버참조 2-30
피연산자수에따른연산자분류 단항연산자 (unary operator): 피연산자의수가 1 개 ++x; --y; 이항연산자 (binary operator) : 피연산자의수가 2 개 x + y x - y 삼항연산자 (ternary operator): 연산자의수가 3 개 x? y : z 2-31
산술연산자 덧셈, 뺄셈, 곱셈, 나눗셈등의사칙연산을수행하는연산자 연산자 기호 의미 예 덧셈 + x와 y를더한다 x+y 뺄셈 - x에서 y를뺀다. x-y 곱셈 * x와 y를곱한다. x*y 나눗셈 / x를 y로나눈다. x/y 나머지 % x를 y로나눌때의나머지값 x%y y mx b y = m*x + b y ax 2 bx c x y x m 3 y = a*x*x + b*x +c m = (x + y + z) / 3 ( 참고 ) 거듭제곱연산자는? C 에는거듭제곱을나타내는연산자는없다. x * x 와같이단순히변수를두번곱한다. 2-32
증감연산자 증감연산자 ++x x++ --x x-- 의미 x 값을먼저증가한후에다른연산에사용한다. 이수식의값은증가된 x 값이다. x 값을먼저사용한후에, 증가한다. 이수식의값은증가되지않은원래의 x 값이다. x 값을먼저감소한후에다른연산에사용한다. 이수식의값은감소된 x 값이다. x 값을먼저사용한후에, 감소한다. 이수식의값은감소되지않은원래의 x 값이다. ++x : 11 x++ : 10 --x : 9 x-- : 10 10 10 1 11 109 9 x + - = 11 9 2-33
주의할점 x = 1; y = 1; nextx = ++x; // x의값이증가된후에사용된다. nextx는 2가된다. nexty = y++;// y의값이사용된후에증가된다. nexty는 1이된다. 2-34
대입연산자 (assignment operator) 왼쪽에있는변수에오른쪽의수식의값을계산하여대입 변수 (variable) = 수식 (expression); x = 10; // 상수 10을변수x에대입한다. y = x; // 변수 x의값을변수y에대입한다. z = 2 * x + y; // 수식 2 * x + y를계산하여변수 z에대입한다. 2 * 10 + 10 = 30 x 10 y z 2-35
복합대입연산자 복합대입연산자란 += 처럼대입연산자 = 와산술연산자를합쳐놓은연산자 소스를간결하게만들수있음 복합대입연산자 의미 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 += 1 // x = x + 1 x *= y + 1 // x = x * (y + 1) x %= x + y // x = x % (x + y) 2-36
형변환 (type conversion) 연산시에데이터의유형이변환되는것 대입연산시형변환 자동적인형변환 정수연산시형변환 형변환 명시적인형변환 수식연산시형변환 자동으로변환되기도하고사용자가바꾸어주기도하죠 2-37
대입연산시의자동적인형변환 올림변환 double f; f = 10 + 20; // f에는 30.0이저장된다. 내림변환 int i; i = 3.141592; // i에는 3이저장된다. 10+20 = 30.0 3.141592 3 f i 2-38
올림변환과내림변환 #include <stdio.h> int main(void) { char c; int i; float f; 10000 16 11.23456 11 30.000000 c i f } c = 10000; // 내림변환 i = 1.23456 + 10; // 내림변환 f = 10 + 20; // 올림변환 printf("c = %d, i = %d, f = %f \n", c, i, f); return 0; c:... convert1.c(10) : warning C4305: '=' : 'int' 에서 'char'( 으 ) 로잘립니다. c:... convert1.c(11) : warning C4244: '=' : 'double' 에서 'int'( 으 ) 로변환하면서데이터가손실될수있습니다. c=16, i=11, f=30.000000 2-39
정수연산시의자동적인형변환 정수연산시 char 형이나 short 형의경우, 자동적으로 int 형으로변환하여계산한다. char x = 10; short y = 20; z = x + y; 10 x char + 20 y short 10 x int + 20 y int z 30 2-40
수식에서의자동적인형변환 서로다른자료형이혼합하여사용되는경우, 더큰자료형으로통일된다. int 형이 double 형으로승급된다. 10 int + 1.2345 double 10.0 double + 1.2345 double 11.2345 전체수식의결과값도 double 형이된다. double 2-41
명시적인형변환 형변환 (type cast): 사용자가데이터의타입을변경하는것 ( 자료형 ) 상수또는변수 (int) 1.23456 (double) x // double 형으로변환 (long) (x+y) // long 형으로변환 1.23456 (int) 1.23456 2-42
관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) 연산자기호 의미 사용예 == x와 y가같은가? x == y!= x와 y가다른가? x!= y > x가 y보다큰가? x > y < x가 y보다작은가? x < y >= x가 y보다크거나같은가? x >= y <= x가 y보다작거나같은가? x <= y 2-43
(x = y) 주의할점! x 의값을 y 에대입한다. 이수식의값은 x 의값이다. (x == y) x 와 y 가같으면 1, 다르면 0 이수식의값이된다. if( x==y) 를 if( x=y ) 로잘못쓰지않도록주의! 2-44
논리연산자 (logical operator) 여러개의조건을조합하여참과거짓을따지는연산자 결과값은참 (1) 아니면거짓 (0) 연산자기호사용예의미 && x && y AND 연산, x 와 y 가모두참이면참, 그렇지않으면거짓 x y OR 연산, x 나 y 중에서하나만참이면참, 모두거짓이면거짓!!x NOT 연산, x 가참이면거짓, x 가거짓이면참 2-45
논리연산의결과값 x y x && y x y 참 참 참 참 참 거짓 거짓 참 거짓 참 거짓 참 거짓 거짓 거짓 거짓 2-46
참과거짓의표현방법 관계수식이나논리수식이만약참이면 1이생성되고거짓이면 0이생성된다. 피연산자의참, 거짓을가릴때에는 0이아니면참이고 0이면거짓으로판단한다. 음수도참으로판단한다. ( 예 ) NOT 연산자를적용하는경우!0 // 식의값은 1!3 // 식의값은 0!!3 // 식의값은 1!-3 // 식의값은 0!0 == 참 (true) 2-47
논리연산자의예 x 는 1, 2, 3 중의하나인가 (x == 1) (x == 2) (x == 3) x 가 60 이상 100 미만이다. (x >= 60) && (x < 100) x 가 0 도아니고 1 도아니다. (x!= 0) && (x!= 1) // x 0 이고 x 1 이다. 2-48
실습 : 윤년 (leap year) // 윤년프로그램 #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 ", result); } return 0; 연도를입력하시오 : 2012 result=1 2-49
조건연산자 (conditional operator) x > y 가참이면 x 가수식의값이된다. max_value = (x > y )? x : y; x > y 가거짓이면 y 가수식의값이된다. absolute_value = (x > 0)? x: -x; // 절대값계산 max_value = (x > y)? x: y; // 최대값계산 min_value = (x < y)? x: y; // 최소값계산 (age > 20)? printf( 성인 n ): printf( 청소년 n ); 2-50
#include <stdio.h> int main(void) { int x,y; 예제 첫번째수 = 두번째수 = 큰수 =3 작은수 =2 2 3 printf(" 첫번째수 ="); scanf("%d", &x); printf(" 두번째수 ="); scanf("%d", &y); } printf(" 큰수 =%d \n", (x > y)? x : y); printf(" 작은수 =%d \n", (x < y)? x : y); 2 >< 3 2 3 x y 2-51
콤마연산자 콤마로연결된수식은순차적으로계산된다. 먼저계산된다. 나중에계산된다. 어떤문장이던지순차적으로실행됩니다. x++, y++ ; 21 23 x y 2-52
비트연산자 (bit operator) 연산자연산자의의미설명 & 비트 AND 두개의피연산자의해당비트가모두 1 이면 1, 아니면 0 비트 OR 두개의피연산자의해당비트중하나만 1 이면 1, 아니면 0 ^ 비트 XOR 두개의피연산자의해당비트의값이같으면 0, 아니면 1 << 왼쪽으로이동 지정된개수만큼모든비트를왼쪽으로이동한다. >> 오른쪽으로이동 지정된개수만큼모든비트를오른쪽으로이동한다. ~ 비트 NOT 0은 1로만들고 1은 0로만든다. 2-53
비트 AND 연산자 0 AND 0 = 0 1 AND 0 = 0 0 AND 1 = 0 1 AND 1 = 1 2-54
비트 OR 연산자 0 OR 0 = 0 1 OR 0 = 1 0 OR 1 = 1 1 OR 1 = 1 2-55
비트 XOR 연산자 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 1 = 1 1 XOR 1 = 0 2-56
비트 NOT 연산자 NOT 0 = 1 NOT 1 = 0 2-57
예제 : 비트연산자 #include <stdio.h> int main(void) { int x = 9; // 1001 int y = 10; // 1010 printf(" 비트 AND = %08X", x & y); // 00001000 printf(" 비트 OR = %08X", x y); // 00001011 printf(" 비트 XOR = %08X", x ^ y); // 00000011 printf(" 비트 NOT = %08X", ~x ); // 11110110 } return 0; 비트 AND = 00000008 비트 OR = 0000000B 비트 XOR = 00000003 비트 NOT = FFFFFFF6 2-58
비트이동 (bit shift) 연산자 연산자기호설명 왼쪽비트이동 << x << y x 의비트들을 y 칸만큼왼쪽으로이동 오른쪽비트이동 >> x >> y x 의비트들을 y 칸만큼오른쪽으로이동 2-59
비트를왼쪽으로이동 값은 2배가된다. << 연산자 2-60
비트를오른쪽으로이동 값은 1/2배가된다. >> 연산자 2-61
예제 : 비트이동연산자 #include <stdio.h> int main(void) { int x = 4; // 0100 printf(" 비트 << = %#08x", x << 1); // 1000 printf(" 비트 >> = %#08x", x >> 1); // 0010 } return 0; 비트 << = 0x000008 비트 >> = 0x000002 2-62
우선순위 (precedence) 어떤연산자를먼저계산할것인지에대한규칙 -- ++ -- ++ / * / * % % + + - - 2-63
우선순위 (precedence) 우선순위연산자결합규칙 1 () [] ->. ++( 후위 ) --( 후위 ) ->( 좌에서우 ) 2 sizeof &( 주소 ) ++( 전위 )--( 전위 ) ~!*( 역참조 ) +( 부호 )-( 부호 ), 형변환 <-( 우에서좌 ) 3 *( 곱셈 )/% ->( 좌에서우 ) 4 +( 덧셈 )-( 뺄셈 ) ->( 좌에서우 ) 5 << >> ->( 좌에서우 ) 6 < <= >= > ->( 좌에서우 ) 7 ==!= ->( 좌에서우 ) 8 &( 비트연산 ) ->( 좌에서우 ) 9 ^ ->( 좌에서우 ) 10 ->( 좌에서우 ) 11 && ->( 좌에서우 ) 12 ->( 좌에서우 ) 13?( 삼항 ) <-( 우에서좌 ) 14 =+=*=/=%=&=^= =<<=>>= <-( 우에서좌 ) 15,( 콤마 ) ->( 좌에서우 ) 2-64
우선순위의일반적인지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 괄호연산자는가장우선순위가높다. 모든단항연산자들은이항연산자들보다우선순위가높다. 콤마연산자를제외하고는대입연산자가가장우선순위가낮다. 연산자들의우선순위가생각나지않으면괄호를이용 ( x <= 10 ) && ( y >= 20 ) 관계연산자나논리연산자는산술연산자보다우선순위가낮다. x + 2 == y + 3 2-65
결합규칙의예 y = a % b / c + d * (e - f); 2 3 4 5 6 1 2-66
Homework 2 2.1 표준입력장치로부터초단위로입력된값을시, 분, 초로환산하는프로그램의 pseudo code와 C program을작성하라. 2.2 1 ~ 32,765 범위의정수 (integer) 값을입력받아, 만의단위, 천의단위, 백의단위, 십의단위, 일의단위값을구분한후, 차례로출력하는알고리즘의 pseudo code를작성하고, 이알고리즘에대한 C 프로그램을작성하라. 가장높은자리수이상의값을 0으로출력하지말것. ( 예 : 12345: 1만 2천 3백 4십 5 123: 1백 2십 5) 2.3 2개의부동소수점데이터 (double type) 를입력받아, 이들의덧셈, 뺄셈, 곱셈, 나눗셈의결과를차례로출력하는프로그램의 pseudo code를작성하고, C 프로그램을작성하라. 2-67