Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

4강.수식과 연산자 본문

C언어/C프로그래밍 기초(1학기)

4강.수식과 연산자

Vloom 2019. 1. 15. 16:57

4.1 수식


▶수식


상수, 변수, 연산자의 조합

연산자피연산자로 구성

결과값을 가짐


int x, y;


x = 3;

y = x*x - 5*x + 6;


printf("%d\n", y);


ex) 예제 프로그램: 간단한 수식 예제

#include <stdio.h>


int main()

{

int x = 1;


printf("3 + 2의 값은 %d\n", 3 + 2);

printf("3 - 2의 값은 %d\n", 3 - 2);

printf("x의 값은 %d\n", x);

printf("x + 1의 값은 %d\n", x + 1);


return 0;

}



3 + 2의 값은 5

3 - 2의 값은 1

x의 값은 1

x + 1의 값은 2


4.2 연산자(1)


▶기능에 따른 연산자의 분류


 연산자의 분류

연산자 

의미 

입 

오른쪽을 왼쪽에 대입 

산술 

+ - * / % 

사칙연산과 나머지 연산 

부호 

+ - 

 

증감 

++ -- 

증가와 감소 연산 

관계 

> < == != >= <=

오른쪽과 왼쪽을 비교

논리 

&& || ! 

논리적인 AND,  OR

sizeof 연산자

sizeof 

자료형이나 변수의 크기를 

바이트 단위로 반환 

형변환

(type) 

변수나 상수의 자료형을 변환 

포인터 연산자

* & [] 

주소 계산, 포인터가 가리키는 곳의 

내용 추출 

구조체 연산자

. -> 

구조체의 멤버 참조 


▶피연산자에 따른 연산자의 분류


단항 연산자: 피연산자의 수가 1개

++x;

--y;


이항 연산자: 피연산자의 수가 2개

x + y

x - y


삼항 연산자: 피연산자의 수가 3개

(x > y) ? x : y


※중간 점검※


Q1. 수식(expression)이란 어떻게 정의되는가?

A1. 결과값을 가지며 연산자와 피연산자로 구성되어있는 상수, 변수, 연산자의 조합


Q2. 상수 10도 수식이라고 할 수 있는가?

A2. 할 수 있다


Q3. 아래의 수식에서 피연산자와 연산자를 구분하여 보라.

  y = 10 + 20;

A3. 연산자: =, +

 피연산자: y, 10, 20


Q4. 연산자를 단항 연산자, 이항 연산자, 삼항 연산자로 나누는 기준은 무엇인가?

A4. 피연산자의 개수


4.3 산술 연산


▶산술 연산자: 사칙 연산과 나머지 연산을 수행하는 연산자


연산자 

기호 

 

덧셈 

+ 

x + y 

뺄셈 

 

x - y 

곱셈 

* 

x * y 

나눗셈 

/ 

x / y 

나머지 

% 

x % y 


cf) 거듭 제곱 연산자: C에는 거듭 제곱을 나타내는 연산자가 없으므로 x * x로 나타냄


ex) 예제 프로그램: 산술 연산자 예제

//산술 연산자 예제


#include <stdio.h>


int main()

{

int x, y, result;


printf("두 개의 정수를 입력하시오: ");

scanf("%d %d", &x, &y);


result = x + y;    //덧셈 연산을 해서 결과를 result에 대입

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;

}


두 개의 정수를 입력하시오: 7 3

7 + 3 = 10

7 - 3 = 4

7 * 3 = 21

7 / 3 = 2

7 % 3 = 1


▶나눗셈 연산자


정수형 간의 나눗셈에서는 결과가 정수형으로 생성

정수형의 나눗셈에서는 소수점 이하는 버려짐 (ex.7/3=1)

부동소수점형 간에는 부동소수점 값을 생성 (ex.7.0/3.0=1.75)


ex) 예제 프로그램: 나눗셈 연산자 예제

//나눗셈 연산자 예제


#include <stdio.h>


int main()

{

double x, y, result;


printf("두 개의 실수를 입력하시오: ");

scanf("%lf %lf", &x, &y);


result = x / y;    //나눗셈 연산을 해서 결과를 result에 대입

printf("%f / %f = %f\n", x, y, result);


return 0;

}


두 개의 실수를 입력하시오: 7.0 3.0

7.000000 + 3.000000 = 11.000000

7.000000 - 3.000000 = 4.000000

7.000000 * 3.000000 = 21.000000

7.000000 / 3.000000 = 2.333333


▶나머지 연산자: 첫 번째 피연산자를 두 번째 피연산자로 나누었을 경우의 나머지를 계산


ex 1) 나머지 연산자를 이용한 짝수와 홀수를 구분: x % 2가 0이면 짝수

ex 2) 나머지 연산자를 이용한 5의 배수를 판단: x % 5가 0이면 5의 배수


ex) 예제 프로그램: 나머지 연산자 예제

//나머지 연산자 프로그램


#include <stdio.h>

#define SEC 60    //1분은 60초  


int main()

{

int input, minute, second;


printf("초단위의 시간을 입력하시오: ");

scanf("%d", &input);    //초단위의 시간을 읽음


minute = input / SEC;     //몇 분

second = input % SEC;    //몇 초


printf("%d초는 %d분 %d초입니다.\n", input, minute, second);


return 0;

}


초단위의 시간을 입력하시오: 73

73초는 1분 13초입니다.


▶증감 연산자


증감 연산자 

의미 

++x 

 x값을 먼저 증가한 후에 다른 연산에 사용

 이 수식의 값은 증가된 x값 

x++ 

 x값을 먼저 사용한 후에 증가

 이 수식의 값은 증가되지 않은 원래의 x값 

--x 

 x값을 먼저 감소한 후에 다른 연산에 사용 

 이 수식의 값은 감소된 x값

x-- 

 x값을 먼저 사용한 후에 감소

 이 수식의 값은 감소되지 않은 원래의 x값 


exx = 1;

y = 1;

 

next_x = ++x;     //x의 값이 증가된 후에 사용, next_x는 2

next_y = y++;      //y의 값이 사용된 후에 증가, next_y는 1


ex) 예제 프로그램: 나머지 연산자 예제

//증감 연산자 예제


#include <stdio.h>


int main()

{

int x = 0, next_x = 0;


next_x = ++x;    //x의 값이 증가된 후에 사용

printf("next_x = %d, x = %d\n", next_x, x);    //next_x = 1, x = 1


next_x = x++;    //x의 값이 사용된 후에 증가

printf("next_x = %d, x = %d\n", next_x, x);    //next_x = 0, x = 1


next_x = --x;    //x의 값이 감소된 후에 사용

printf("next_x = %d, x = %d\n", next_x, x);    //next_x = -1, x = -1


next_x = x--;    //x의 값이 사용된 후에 감소

printf("next_x = %d, x = %d\n", next_x, x);    //next_x = 0, x = -1


return 0;

}


next_x = 1, x = 1

next_x = 0, x = 1

next_x = -1, x = -1

next_x = 0, x = -1


4.4 대입 연산


▶대입(배정, 할당) 연산자: 왼쪽에 있는 변수에 오른 쪽의 수식의 값을 계산하여 대입


변수(variable) = 수식(expression);


x = 10;               //상수 10을 변수 x에 대입


y = x;                //변수 x의 값을 변수 y에 대입


z = 2 * x + y;     //수식을 계산하여 변수 z에 대입


▶대입 연산자 주의점


왼쪽에는 항상 변수가 와야 함

x + 2 = 0;    //왼편이 변수 이름이 아니기 때문에 잘못된 수식!

2 = x;        //왼편이 변수 이름이 아니기 때문에 잘못된 수식!


수학적으로는 올바르지 않지만 C에서는 가능

x = x + 1;    //x의 값이 하나 증가


ex) 예제 프로그램: 대입 연산자 예제

/* 대입 연산자 프로그램 */


#include <stdio.h>


int main()

{

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 = 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 


ex) 예제 프로그램: 복합 대입 연산자 예제

//복합 대입 연산자 프로그램    


#include <stdio.h>


int main()

{

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 = 1


4.4 관계 연산


▶관계 연산자


두개의 피연산자를 비교하는 연산자

결과값 참(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 


1 == 2     //1과 2가 다르므로 거짓(0)

1 != 2      //1과 2가 다르므로 참(1)

2 < 1      //2가 1보다 작지 않으므로 거짓(0)

x >= y     //x가 y보다 크거나 같으면 참(1) 그렇지 않으면 거짓(0)


ex) 예제 프로그램: 관계 연산자 예제

//관계 연산자 예제


#include <stdio.h>


int main()

{

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;

}


두개의 정수를 입력하시오: 7 3

x == y의 결과값: 0

x != y의 결과값: 1

x > y의 결과값: 1

x < y의 결과값: 0

x >= y의 결과값: 1

x <= y의 결과값: 0


▶관계 연산자 주의점


(x = y): x의 값을 y에 대입하며 이 수식의 값은 x의 값

(x == y): x와 y가 같으면 1, 다르면 0이 수식의 값

if(x == y)를 if(x = y)로 잘못 쓰지 않도록 주의


※중간 점검※


Q1. 관계 수식의 결과로 생성될 수 있는 값은 무엇인가?

A1. 0과 1


Q2. (3 >= 2) + 5의 값은?

A2. 6


4.5 논리 연산


▶논리 연산자


여러 개의 조건을 조합하여 참과 거짓을 따지는 연산자

결과값은 참(1) 아니면 거짓(0)


사용 예 

의미 

x && y 

 AND 연산, x와 y가 모두 참이면 참, 그렇지 않으면 거짓 

x || y 

 OR 연산, x나 y중에서 하나만 참이면 참, 모두 거짓이면 

 거짓

!x 

 NOT 연산, x가 참이면 거짓, x가 거짓이면 참 


▶논리 연산자의 결과값


 x 

 y 

x AND y 

x OR y 

NOT x 

T

T

T 

T 

F 

 T 

 F 

F 

T 

F 

 F 

 T 

F 

T 

T 

 F 

 F 

F 

F 


▶참과 거짓의 표현 방법


기본적으로 참(true)은 1로, 거짓(false)은 0로 표현

관계 수식이나 논리 수식이 거짓으로 계산되면 0, 참으로 계산되면 1을 생성

피연산자의 참과 거짓을 가릴 때는 0이 아니면 참이고, 0이면 거짓으로 판단 (ex.-1: 참)


▶AND 연산자: 두 개의 피연산자가 모두 참일 때만 연산 결과가 참


cf) 주의할 점

   (2 < x < 5): 가능하지만 논리적으로 잘못된 수식

   ●(2 < x) && (x < 5): 올바른 수식


▶OR 연산자: 하나의 피연산자만 참이면 연산 결과가 참


▶NOT 연산자


피연산자의 값이 참이면 연산의 결과값을 거짓으로 만듦

피연산자의 값이 거짓이면 연산의 결과값을 참으로 만듦


▶단축 계산


&& 연산자의 경우, 첫번째 피연산자가 거짓이면 다른 피연산자들은 계산X

|| 연산자의 경우, 첫번째 피연산자가 참이면 다른 피연산자들은 계산X


ex) 예제 프로그램: 논리 연산자 예제

//논리 연산자 예제


#include <stdio.h>


int main()

{

int x, y;


printf("두개의 정수를 입력하시오: ");

scanf("%d %d", &x, &y);


printf("%d && %d의 결과값: %d\n", x, y, x && y);     //AND 연산

printf("%d || %d의 결과값: %d\n", x, y, x || y);        //OR 연산

printf("!%d의 결과값: %d\n", x, !x);                          //NOT 연산


return 0;

}


두개의 정수를 입력하시오: 1 0

1 && 0의 결과값: 0

1 || 0의 결과값: 1

!1의 결과값: 0


▶조건 연산자: ex1가 참이면 ex2를 반환, 그렇지 않으면 ex3를 반환


ex1 ? ex2 : ex3


absolute_value = (x > 0) ? x : -x   //절대값 계산

max_value = (x > y) ? x : y            //최대값 계산

min_value = (x > y) ? x : y             //최소값 계산


ex) 예제 프로그램: 조건 연산자 예제

//조건 연산자를 이용한 큰수, 작은수 판단 프로그램


#include <stdio.h>


int main()

{

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


return 0;

}


첫번째 수 = 3

두번째 수 = 9

큰수 = 9

작은수 = 3


4.6 우선 순위와 결합 법칙


▶우선 순위: 수식에서 어떤 연산자를 먼저 계산할 것인지에 대한 규칙


우선 순위 

연산자 

1 

 () [] -> . ++(후위) --(후위) 

2 

 sizeof &(주소) ++(전위) --(전위) ~ ! *(역참조) +(부호) 

 -(부호) 형변환

3 

 *(곱셈) / % 

4 

 +(덧셈) -(뺄셈) 

5 

 << >> 

6 

 < <= >= > 

7 

 == != 

8 

 &(비트연산) 

9 

 ^ 

10 

 | 

11 

 && 

12 

 || 

13

 ?(삼항) 

14 

 = += *= /= %= &= ^= |= <<= >>= 

15 

 ,(콤마) 


▶우선 순위의 일반적인 지침


콤마<대입<논리<관계<산술<단항

괄호 연산자는 가장 우선순위가 높음

모든 단항 연산자들은 이항 연산자들보다 우선순위가 높음

콤마 연산자를 제외하고는 대입 연산자가 가장 우선순위가 낮음

연산자들의 우선순위가 생각나지 않으면 괄호를 이용

관계 연산자나 논리 연산자는 산술 연산자보다 우선순위가 낮음


▶결합 규칙: 동일한 우선 순위를 가지는 연산들이 여러 개가 있으면 어떤 것을 먼저 수행하여야 하는가

        에 대한 규칙


결합 방향(좌→우): ex. x * y * z

결합 방향(우→좌): ex. x = y = z


ex) 예제 프로그램: 우선 순위 예제

 //우선 순위 예제


#include <stdio.h>


int main()

{

int x = 0, y = 0;

int result;


result = 3 > 9 || 4 > 8            //result = 0 || 0 = 0

printf("%d\n", result);


result = 3 || 9 && 9 > 1;        //result = 1 || 1 && 1 = 1

printf("%d\n", result);


result = x = y = 1;                 //result = 1

printf("%d\n", result);


result  = - ++x + y--;             //result = -1

printf("%d\n", result);


return 0;

}


0

1

1

-1


4.7 형변환


▶형변환: 연산 시 데이터의 유형이 변환되는 것


자동적인 형변환: 대입연산시 형변환, 정수연산시 형변환, 수식연산시 형변환

명시적인 형변환


▶대입 연산시의 자동적인 형변환


림 변환

double f;

f = 10;        //f에는 10.0이 저장


내림 변환

int i;

i = 3.141592;    //i에는 3이 저장


▶수식에서의 자동적인 형변환: 서로 다른 자료형이 혼합하여 사용되는 경우, 더 큰 자료형으로 통일

  (ex. int + double double + double)


▶명시적인 형변환


(자료형) 상수 또는 변수


(int) 1.23456     //상수

(double) x          //변수

(long) (x + 1)      //수식


ex) 예제 프로그램: 형변환 예제

//형변환 예제


#include <stdio.h>


int main()

{

int f, i;


f = 5 / 4;                  //f는 1

printf("%f", f);


f = (double) 5 / 4;    //f = 1.25

printf("%f", f);


f = (double) 5 / (double) 4;    //f는 1.25

printf("%f", f);


i = 3.9 + 12.4;    //i는 16

printf("%d", i);


i = (int) 3.9 + (int) 12.4;    //i는 15

printf("%d", i);


return 0;

}


1.000000

1.250000

1.250000

16

15


'C언어 > C프로그래밍 기초(1학기)' 카테고리의 다른 글

6강.반복문  (0) 2019.01.25
5강.조건문  (0) 2019.01.23
3강.변수와 자료형  (0) 2019.01.14
2강.C언어 기초(2)  (0) 2019.01.14
1강.C언어 기초(1)  (0) 2019.01.11