Trivia
4강.수식과 연산자 본문
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
▶나눗셈 연산자
①정수형 간의 나눗셈에서는 결과가 정수형으로 생성
②정수형의 나눗셈에서는 소수점 이하는 버려짐 (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값 |
ex) x = 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 |
T |
▶참과 거짓의 표현 방법
①기본적으로 참(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 |