쉽게풀어쓴 C 언어 Express 제 5 장수식과연산자 컴퓨터프로그래밍기초
이번장에서학습할내용 * 수식과연산자란? * 대입연산 * 산술연산 * 논리연산 * 관계연산 * 우선순위와결합법칙 이번장에서는수식과연산자를살벼봅니다. 컴퓨터프로그래밍기초 2
수식 수식 (expression) x + y x*x + 5*x + 6 (principal * interest_rate * period) / 12.0 수식 (expression) 상수, 변수, 연산자의조합 연산자와피연산자로나누어진다. 컴퓨터프로그래밍기초 3
기능에따른연산자의분류 연산자의분류연산자의미 대입 = 오른쪽을왼쪽에대입 산술 + - * / % 사칙연산과나머지연산 부호 + - 증감 ++ -- 증가, 감소연산 관계 > < ==!= >= <= 오른쪽과왼쪽을비교 논리 &&! 논리적인 AND, OR 조건? 조건에따라선택 콤마, 피연산자들을순차적으로실행 비트단위연산자 & ^ ~ << >> 비트별 AND, OR, XOR, 이동, 반전 sizeof 연산자 sizeof 자료형이나변수의크기를바이트단위로반환 형변환 (type) 변수나상수의자료형을변환 포인터연산자 * & [] 주소계산, 포인터가가리키는곳의내용추출 구조체연산자. -> 구조체의멤버참조 컴퓨터프로그래밍기초 4
피연산자수에따른연산자분류 단항연산자 : 피연산자의수가 1 개 ++x; --y; 이항연산자 : 피연산자의수가 2 개 x + y x - y 삼항연산자 : 연산자의수가 3 개 x? y : z 컴퓨터프로그래밍기초 5
대입 ( 배정, 할당 ) 연산자 왼쪽에있는변수에오른쪽의수식의값을계산하여대입 변수 (variable) = 수식 (expression); x = 10; // 상수 10을변수x에대입한다. y = x; // 변수 x 의값을변수 y 에대입한다. z = 2 * x + y; // 수식 2 * x + y를계산하여변수 z에대입한다. 컴퓨터프로그래밍기초 6
대입연산자주의점 왼쪽에는항상변수가와야한다. x + 2 = 0; // 왼편이변수이름이아니기때문에잘못된수식!! 2 = x; // 왼편이변수이름이아니기때문에잘못된수식!! 다음의문장은수학적으로는올바르지않지만 C 에서는가능 x = x + 1; // x 의값이하나증가된다. 컴퓨터프로그래밍기초 7
대입연산의결과값 덧셈연산의결과값은 9 x = 2 + 7; 모든연산에는결과값이있고대입연산도결과값이있습니다. 대입연산의결과값은 9 ( 현재는사용되지않음 ) 덧셈연산의결과값은 9 y = 10 + ( x = 2 + 7 ); 대입연산의결과값은 9 덧셈연산의결과값은 19 대입연산의결과값은 19 ( 현재는사용되지않음 ) 컴퓨터프로그래밍기초 8
예제 /* 대입연산자프로그램 */ #include <stdio.h> int main(void) { int x, y; 수식의결과값을출력하여보는예제입니다. x = 1; 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 y=x=3); } return 0; 컴퓨터프로그래밍기초 수식 x+1의값은2 수식 y=x+1의값은2 수식 y=10+(x=2+7) 의값은 19 수식 y=x=3의값은3 9
산술연산자 덧셈, 뺄셈, 곱셈, 나눗셈등의사칙연산을수행하는연산자 연산자기호의미예 덧셈 + x 와 y 를더한다 x+y 뺄셈 - x 에서 y 를뺀다. x-y 곱셈 * x 와 y 를곱한다. x*y 나눗셈 / x 를 y 로나눈다. x/y 나머지 % x 를 y 로나눌때의나머지값 x%y y y m mx b y = m*x + b 2 ax bx c y = a*x*x + b*x +c x y x 3 m = (x + y + z) / 3 ( 참고 ) 거듭제곱연산자는? C에는거듭제곱을나타내는연산자는없다. x*x x 와같이단순히변수를두번곱한다. 컴퓨터프로그래밍기초 10
예제 // 산술연산자를이용한프로그램 #include <stdio.h> int main(void) { int a,b; } printf(" 첫번째연산자 ="); scanf("%d", &a); printf(" 두번째연산자 ="); scanf("%d", &b); printf("%d + %d 은 %d\n", a, b, a+b); printf("%d - %d 은 %d\n", a, b, a-b); printf("%d * %d 은 %d\n", a, b, a*b); printf("%d / %d 은 %d\n", a, b, a/b); printf("%d %% %d 은 %d\n", a, b, a%b); 첫번째연산자 =2 두번째연산자 =3 2 + 3 은 5 2-3 은 -1 2 * 3 은 6 2 / 3 은 0 2%3 은 2 컴퓨터프로그래밍기초 11
나눗셈연산자 정수형끼리의나눗셈에서는결과가정수형으로생성하고부동소수점형끼리는부동소수점값을생성된다. 정수형끼리의나눗셈에서는소수점이하는버려진다. 3.0 / 2.0 1.5 부동소수점 부동소수점 뒤의형변환에서자세히학습합니다. 3 / 2 1 정수 정수 컴퓨터프로그래밍기초 12
컴퓨터프로그래밍기초 // 나눗셈연산자프로그램 #include <stdio.h> 나눗셈연산자 int main(void) { printf("3/2 = %d \n", 3/2); // 정수 / 정수 printf("4/2 = %d \n", 4/2); printf("5/2 = %d \n", 5/2); printf("3.0/2.0 = %f \n", 3.0/2.0); // 부동소수점 / 부동소수점 printf("4.0/2.0 = %f \n", 4.0/2.0); printf("5.0/2.0 = %f \n", 5.0/2.0); printf("3.0/2 = %f \n", 3.0/2); // 부동소수점 / 정수 return 0; } 3/2 = 1 4/2 = 2 5/2 = 2 3.0/2.0 = 1.500000 4.0/2.0 0 = 2.000000 5.0/2.0 = 2.500000 3.0/2 = 1.500000 13
나머지연산자 나머지연산자 (modulus operator) 는첫번째피연산자를두번째피연산자로나누었을경우의나머지를계산 10 % 2는 0이다. 5 % 7 는 5 이다. 30 % 9는 3이다. 나머지연산자를이용한짝수와홀수를구분 x % 2가 0이면짝수 아주유용한연산자입니다. 나머지연산자를이용한 5 의배수판단 x % 5 가 0 이면 5 의배수 컴퓨터프로그래밍기초 14
나머지연산자 // 나머지연산자프로그램 #include <stdio.h> #define SEC_PER_MINUTE 60 // 1 분은 60 초 int main(void) { int input, minute, second; printf(" 초단위의시간을입력하시요 :(32 억초이하 ) "); scanf("%d", &input); // 초단위의시간을읽는다. minute = input / SEC_PER_MINUTE; second = input % SEC_PER_MINUTE; // 몇분 // 몇초 } printf("%d초는 %d분 %d초입니다. \n", input, minute, second); return 0; 컴퓨터프로그래밍기초 초단위의시간을입력하시요 :(32 억초이하 )70 70초는 1분 10초입니다. 15
부호연산자 변수나상수의부호를변경 x = -10; y = -x; // 변수 y의값은10이된다. - 는이항연산자이기도하고단항연산자이기도하죠 컴퓨터프로그래밍기초 16
복합대입연산자 복합대입연산자란 += 처럼대입연산자 = 와산술연산자를합쳐놓은연산자 소스를간결한게만들수있음 복합대입연산자 x += y x -= y x *= y x /= y 의미 x = x + y x = x - y x = 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 *= 5 // x = x * 5 x -= y + 1 // x = x - (y + 1) x *= y + 1 // x = x * (y + 1) x += y / z // x = x + y / z x %= x + y // x = x % (x + y) 컴퓨터프로그래밍기초 17
// 복합대입연산자프로그램 #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 ); 주의!! } printf("x = %d y = %d z = %d \n", x, y, z); return 0; x=11 y=20 z=2 컴퓨터프로그래밍기초 18
증감연산자 증감연산자 ++x x++ --x x-- 의미 x값을먼저증가한후에다른연산에사용한다. 이수식의값은증가된 x값이다. x 값을먼저사용한후에, 증가한다. 이수식의값은증가되지않은원래의 x 값이다. x 값을먼저감소한후에다른연산에사용한다. 이수식의값은감소된 x 값이다. x값을먼저사용한후에, 감소한다. 이수식의값은감소되지않은원래의 x값이다. 컴퓨터프로그래밍기초 19
// 증감연산자를이용한프로그램 #include <stdio.h> int main(void) { int x = 10; 복합대입연산자 } printf(" 수식 x++ 의값 : %d \n", x++); printf(" 현재 x의값 : %d \n", x); printf(" 수식 ++x 의값 : %d \n", ++x); printf(" 현재 x의값 : %d \n", x); printf(" 수식 x-- 의값 : %d \n", x--); printf(" 현재 x의값 : %d \n", x); printf(" 수식 --x 의값 : %d \n", --x); printf(" 현재 x 의값 : %d \n", x); 수식 x++ 의값 : 10 현재 x의값 : 11 수식 ++x 의값 : 12 현재 x 의값 :12 수식 x-- 의값 : 12 현재 x의값 : 11 수식 --x 의값 : 10 현재 x의값 : 10 컴퓨터프로그래밍기초 20
형변환 연산시에데이터의유형이변환되는것 대입연산시형변환 자동적인형변환 정수연산시형변환 형변환 명시적인형변환 수식연산시형변환 자동으로변환되기도하고사용자가바꾸어주기도하죠 컴퓨터프로그래밍기초 21
대입연산시의자동적인형변환 올림변환 double f; f = 10 + 20; // f에는 30.0이저장된다. 내림변환 int i; i = 3.141592; // i 에는 3 이저장된다. 컴퓨터프로그래밍기초 22
#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:\CPROGRAM\convert1\convert1.c(10) : warning C4305: '=' : truncation from 'const int ' to 'char ' C:\CPROGRAM\convert1\convert1.c(11) : warning C4244: '=' : conversion from 'const double ' to 'int ', possible loss of data 컴퓨터프로그래밍기초 c = 16, i = 11, f = 30.000000 23
정수연산시의자동적인형변환 정수연산시 char 형이나 short 형의경우, 자동적으로 int 형으로변환하여계산한다. char x = 10; short y = 20; z = x + y; y 컴퓨터프로그래밍기초 24
// 정수연산시의자동형변환프로그램 #include <stdio.h> int main(void) { char x = 100; char y = 100; char z; 예제 } z = x + y; printf("z = %d \n", z); printf("x + y = %d \n", x + y); return 0; z = -56 x + y = 200 컴퓨터프로그래밍기초 25
수식에서의자동적인형변환 서로다른자료형이혼합하여사용되는경우, 더큰자료형으로통일된다. 컴퓨터프로그래밍기초 26
명시적인형변환 형변환 (type cast): 사용자가데이터의타입을변경하는것 ( 자료형 ) 상수또는변수 (double) (5) f = (double)i + (double)j; f = (double)((int)y + 3); f = (float)(x = 5); // 수식 x = 5 의결과값인 5 가 float 형으로변환 컴퓨터프로그래밍기초 27
예제 1. int i; 2. double f; 3. f = 5 / 4; 4. f = (double)5 / 4; 5. f = 5 / (double)4; 6. f = (double)5 / (double)4; 7. i = 1.3 + 1.8; 8. i= (int)1.3 + (int)1.8; // f는 1 // f는 1.25 // f 는 125 1.25 // f는 1.25 // i 는 3 // i는 2 컴퓨터프로그래밍기초 1. 정수형변수 i 선언 2. 부동소수점형변수 f 선언 3. ( 정수 / 정수 ) 는정수 4. 5 를부동소수점으로변환하여계산, 전체는부동소수점형이됨 5. 4를부동소수점으로변환하여계산, 전체는부동소수점형이됨 6. 5와 4를모두부동소수점으로변환하여계산 7. 1.3+1.8은 3.1로계산되고정수형변수에대입되므로 i는 3 8. (int)1.3 + (int)1.8은 1+1로되어서 i는 2 28
관계연산자 두개의피연산자를비교하는연산자 결과값은참 (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 컴퓨터프로그래밍기초 29
사용예 1 == 2 // 1 과 2 가같지않으므로거짓 1!= 2 // 1와 2가다르므로참 1 <= 2 // 1이 2보다작으므로참 1 < 2 // 1 이 2보다작으므로참 (1+2) == (1*2) // (1+2) 가 (1*2) 와같지않으므로거짓 x >= y // x가 y보다크거나같으면참 i == 10 // i 가 10 과같으면참 k > 3 m!= 6 // k 가 3 보다크면참 // m 과 6 이같지않으면참 int bool; bool = (3 == 5); // bool에는 0이대입된다. bool = (3 == 3); // bool에는 1이대입된다. bool = (5 == 5) + (6!= 1); // bool에는 1+1=2가대입된다. 컴퓨터프로그래밍기초 30
예제 1. #include <stdio.h> 2. int main(void) 3. { 4. int x=10, y=20; 5. int r1, r2, r3, r4; 6. 7. r1 = (x == y); // 같으면 1 8. r2 = (x!= y); // 다르면 1 9. r3 = (x >= y); // 크거나같으면 1 10. r4 = (x <= y); // 작거나같으면 1 11. printf("r1=%d \n", r1); 12. printf("r2=%d \n", r2); 13. printf("r3=%d \n", r3); 14. printf("r4=%d \n", r4); 15. return 0; 16. } r1=0 r2=1 컴퓨터프로그래밍기초 r3=0 r4=1 31
논리연산자 여러개의조건을조합하여참과거짓을따지는연산자 결과값은참 (1) 아니면거짓 (0) 연산자기호사용예의미 && x && y AND 연산, x 와 y 가모두참이면참, 그렇지않으면거짓 x y OR 연산, x 나 y 중에서하나만참이면참, 모두거짓이면거짓!!x NOT 연산, x 가참이면거짓, x 가거짓이면참 컴퓨터프로그래밍기초 32
논리연산의결과값 수학적인논리연산 x y x AND y x OR y NOT x F F F F T F T F T T T F F T F T T T T F C 에서의논리연산 x y x&&y x y!x 0 0 0 0 1 0 0 이아닌값 0 1 1 0이아닌값 0 0 1 0 0이아닌값 0이아닌값 1 1 0 C에서는 0이아닌값은참으로취급합니다. 컴퓨터프로그래밍기초 33
참과거짓의표현방법 관계수식이나논리수식이만약참이면 1 이생성되고거짓이면 0 이생성된다. 피연산자의참, 거짓을가릴때에는 0이아니면참이고 0이면거짓으로판단한다. 음수는거짓으로판단한다. ( 예 ) NOT 연산자를적용하는경우!0 // 0을거짓으로취급하므로, 그것의부정인 1이결과가된다.!3 // 3이 0이아니므로참으로취급하고, 그것의부정인 0이결과가된다.!100 // 100 이 0 이아니므로참이되고, 그것의부정인 0 이결과가된다.!-3 // 음수는거짓이므로 0이되고, 그것의부정인 1이결과가된다.!x // 변수 x의값이0이면 1, 0이아니면 0!(x + 1) // 수식 (x+1) 의값이0이면 1, 0이아니면 0!(x > y && x < z) // 관계수식 x > y && x < z의값이0이면 1, 0이아니면 0 컴퓨터프로그래밍기초 34
AND 와 OR 연산자 1 && 2 // 피연산자모두 0 이아니므로전체수식은참 (1==2) && (2==2) // 하나의피연산자만참이므로전체수식은거짓 (1==2) (2==2) // 하나의피연산자가참이므로전체수식은참 (x>10) && (x<20) // x가 10보다크고 20보다작으면참이다. (x>10) (x<20) // x 가 10 보다크거나 20 보다작으면참이다 ( 항상참 ). 컴퓨터프로그래밍기초 35
논리연산자의계산과정 논리연산의결과값은항상 1 또는 0 이다. ( 예 ) 0이아닌값을참으로취급하지만논리연산의결과값은항상 1 또는 0입니다. 컴퓨터프로그래밍기초 36
예제 // 논리연산자프로그램 #include <stdio.h> int main(void) { int x=10, y=20; int r1, r2, r3, r4; r1 = (x == 10 && y == 20); r2 = (x == 10 && y == 30); r3 = (x >= 10 y >= 30); r4 =!(x == 5); printf("r1=%d \n", r1); printf("r2=%d \n", r2); printf("r3=%d \n", r3); printf("r4=%d \n", r4); r1=1 r2=0 r3=1 r4=1 컴퓨터프로그래밍기초 } return 0; 37
논리연산자의우선순위! 연산자의우선순위는증가연산자 ++ 나감소연산자 -- 와동일 && 와 연산자의우선순위는모든산술연산자나관계연산자보다낮다. && 가 연산자보다는우선순위가높다. x < 0 x > 10 x>5 x<10 && x>0 // x>5 (x<10 && x>0) 와동일 (x>5 x<10) && x>0 정신적인안정을위하여괄호를사용하여도됩니다. 컴퓨터프로그래밍기초 38
윤년을판단하는문제 1 연도가 4 로나누어떨어진다. 예제 2 100으로나누어떨어지는연도는제외한다. 3 400으로나누어떨어지는연도는윤년이다. // 윤년프로그램 #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; } 컴퓨터프로그래밍기초 39
단축계산 && 연산자의경우, 첫번째피연산자가거짓이면다른피연산자들을계산하지않는다. ( 2 > 3 ) && ( ++x < 5 ) 연산자의경우, 첫번째피연산자가참이면다른피연산자들을계산하지않는다. ( 3 > 2 ) ( --x < 5 ) 첫번쨰연산자가참이면다른연산자는계산할필요가없겠군!! ++ 나 -- 는실행이안될수도있으니주의하세요. 컴퓨터프로그래밍기초 40
조건연산자 exp1 가참이면 exp2 를반환, 그렇지않으면 exp3 를반환 exp1? exp2 : exp3 (5 > 2)? 5 : 2 // 5가 2보다크므로 5 (1.2 > 1.1)? 1 : 0 // 1.2가 1.1보다크므로 1 (x == 0)? 100: 200 // x 가 0 과같으면 100 그렇지않으면 200 컴퓨터프로그래밍기초 41
예제 #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); 첫번째수 =2 두번째수 =3 큰수 =3 작은수 =2 컴퓨터프로그래밍기초 42
콤마연산자 콤마로연결된수식은순차적으로계산된다. x=1, y=2; x = ( 2+5, 5-3 ); x = 2+3, 2353 5-3; x++, y++; printf("thank"), printf(" you!\n"); x=1; y=2; 와동일 x=2가된다 x=5가된다 x와 y는 1 증가된다. Thank you! 어떤문장이던지순차적으로실행됩니다. 컴퓨터프로그래밍기초 43
sizeof 연산자 피연산자들의크기를바이트단위로반환 size_t n = sizeof( int ); 컴퓨터프로그래밍기초 44
예제 #include <stdio.h> int main(void) { int i; double f; size_t n; n = sizeof(int); printf("int형의크기 =%u \n", n); n = sizeof(i); printf(" 변수 i 의크기 =%u \n", n); } n = sizeof f; printf(" 변수 f 의크기 =%u \n", n); int형의크기 =4 변수 i의크기 =4 컴퓨터프로그래밍기초 변수 f 의크기 =8 45
우선순위 수식에서어떤연산자를먼저계산할것인지의문제 우선순위연산자결합규칙 1 () [] ->. ++( 후위 ) --( 후위 ) ->( 좌에서우 ) 2 sizeof &( 주소 ) ++( 전위 ) --( 전위 ) ~! *( 역참조 ) +( 부호 ) -( 부호 ), 형변환 <-( 우에서좌 ) 3 *( 곱셈 ) / % ->( 좌에서우 ) 4 +( 덧셈 ) -( 뺄셈 ) ->( 좌에서우 ) 5 << >> ->( 좌에서우 ) 6 < <= >= > ->( 좌에서우 ) 7 ==!= ->( 좌에서우 ) 8 &( 비트연산 ) ->( 좌에서우 ) 9 ^ ->( 좌에서우 ) 10 ->( 좌에서우 ) 11 && ->( 좌에서우 ) 12 ->( 좌에서우 ) 13?( 삼항 ) ->( 우에서좌 ) 14 = += *= /= %= &= ^= = <<= >>= ->( 우에서좌 ) 15,( 콤마 ) ->( 좌에서우 ) 컴퓨터프로그래밍기초 46
우선순위의일반적인지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 괄호연산자는가장우선순위가높다. 모든단항연산자들은이항연산자들보다우선순위가높다. 콤마연산자를제외하고는대입연산자가가장우선순위가낮다. 연산자들의우선순위가생각나지않으면괄호를이용 ( x <= 10 ) && ( y >= 20 ) 관계연산자나논리연산자는산술연산자보다우선순위가낮다. x + 2 == y + 3 컴퓨터프로그래밍기초 47
결합규칙 만약같은우선순위를가지는연산자들이여러개가있으면어떤것을먼저수행하여야하는가의규칙 컴퓨터프로그래밍기초 48
예제 #include <stdio.h> int main(void) { int x = 2, y = 3, z = 4; } printf("%d \n", 2 + 3 >= 3 +!2); printf("%d \n", 2 > 3 6 > 7); printf("%d \n", 2 3 && 3 > 2); printf("%d \n", - ++x + y--); printf("%d \n", x = y = z = 6 ); printf("%d \n", (x = 2 + 3, 2-3)); printf("%d \n", x /= x = x * y ); 1 0 1 0 6-1 1 컴퓨터프로그래밍기초 49
Q & A 컴퓨터프로그래밍기초 50