0. 기본적인 연산자
- 연산자는 기능에 따라 분류할 수 있고, 피연산자의 갯수로 분류가 가능
- 피연산자가 하나면 단항 연산자, 두개면 이항 연산자, 3개면 삼항 연산자라고 부름
- 3 // - : 단항 연산자, 3 : 피연산자
3 + 5 // + : 2항 연산자, 3,5 : 피연산자(2개)
(3 < 5) ? 1 : 0 // ? : 3항 연산자, (3 < 5), 1, 0 : 피연산자(3개)
- 위 3항 연산자에서 보면 알 수 있듯이 피연산자로는 상수와 변수 뿐만 아니라 수식도 피연산자로 직접 사용이 가능
기본연산자 기능 분류 | 생김새 | 쓰임새 |
산술 연산자 | +, -, *, /, % | 수학연산, %는 나머지 연산, +,-의 경우 숫자의 단항으로 쓰일 시 부호를 나타냄 |
대입 연산자 | = | 오른쪽의 결과값을 왼쪽의 변수에 할당 |
증감 연산자 | ++, -- | 단항으로 쓰이며 값을 1올리거나 1줄임 후위(변수의 뒤)로 붙으면 변수의 값을 사용하고 난 후 1 증가함 |
관계 연산자 | >, >=, <. <=, ==, != | 초과, 이상, 미만, 이하, 일치, 불일치 |
논리 연산자 | &&, ||, !(유일한 단항) | a && b : 논리곱 (AND) a와 b 모두 참이면 1 아니면 0 a || b : 논리합 (OR) a와 b중 하나라도 참이면 1 아니면 0 !a : 논리부정 (NOT) a가 거짓이면 1, 참이면 0 |
0-1. 숏서킷룰
- 위에 논리 연산자 중 &&와 || 는 숏 서킷 룰이 적용 됨
- 숏 서킷 룰이란 좌항 만으로 &&와 ||의 연산 결과를 판별하는 기능
- 예를 들어 &&는 좌항이 거짓이면 오른쪽 항을 확인하지 않고 바로 결과값을 리턴함
(a < 0) && (++b > 20)
- 위 같은 코드가 있을 경우 b는 반드시 증가되리라는 보장이 없음을 주의 (a가 음수면 우항은 들어가지 않기 때문)
0-2. 컴퓨터 내부에서의 연산 처리
- 컴퓨터는 우리가 만든 연산을 진행함에 있어서 1. 로드, 2. 연산, 3. 스토어(저장)을 수행함
int a = 10;
int b = 20;
int sum = a + b;
- 위의 코드의 연산을 하려면 컴퓨터는 CPU의 저장 공간인 레지스터라는 곳으로 변수 a, 변수 b의 값을 복사함
- 이 과정을 로드라고 하며, 변수 a와 변수 b는 우리의 메모리공간에 존재함
- CPU는 ALU라고 하는 연산장치를 가지고 있으며, 이 연산장치로 연산식을 계산함 이 과정을 연산이라고 함
- 결과값을 레지스터에 저장하고 sum이라는 이름이 붙은 메모리공간에 저장함 이 과정을 스토어라고 함
- CPU의 메모리를 레지스터라고 하는데, CPU의 클럭과 1:1 동기화 되어 있어 메모리(RAM) 보다 빠름
- 다만 레지스터는 다른 연산을 위해 계속 사용되므로 메모리에 옮기지 않으면 값은 사라짐
1. 여러가지 연산자
1-1. 형 변환 연산자
- 형 변환 연산자는 단항연산자로 피연산자의 값을 일시적으로 원하는 형태로 바꿈
- 사용 방법은 (일시적으로 바꾸고 싶은 자료형)피연산자
#include <stdio.h>
int main(void)
{
int a = 10;
printf("%lf", (double)a); // 일시적으로 a를 double형으로 변환
printf("\n");
double b = 10.7;
printf("%d", (int)b); // 일시적으로 b를 int형으로 변환
return 0;
}
더보기
//결과값
10.000000
10
1-2. 묵시적 형변환 (자동 형 변환)
- 컴퓨터는 데이터의 형태에 따라 다른 연산방법을 사용하기 때문에 피연산자가 2개 이상일 경우 피연산자의 형태는 같아야 함
- 따라서 컴파일러는 컴파일 과정에서 피연산자의 형태가 다르면 형태를 일치시키는 작업을 수행함
- 이를 "자동 형변환" 혹은 "묵시적 형변환" 이라고 부름
- 1) 기본 규칙으로는 데이터 크기가 작은 값이 크기가 큰 값으로 바뀜 (정수 + 실수의 경우 정수가 실수로 변환)
- 2) 다만 대입연산의 경우 메모리에 값을 넣는 것이므로 좌항의 변수에 맞춰짐
1-3. sizeof 연산자
- 피연산자의 크기를 바이트 단위로 계산해서 알려줌
- 문법으로는 sizeof(피연산자)로 표기하며 대상은 변수, 상수, 수식, 자료형 등이 전부 가능함
#include <stdio.h>
int main(void)
{
int a = 10;
double b = 3.4;
printf("int형 변수의 크기 : %d\n", sizeof(a));
printf("double형 변수의 크기 : %d\n", sizeof(b));
printf("정수형 상수의 크기 : %d\n", sizeof(1));
printf("수식의 결과값의 크기 : %d\n", sizeof(1.5 + 3.4));
printf("char 자료형의 크기 : %d\n", sizeof(char));
return (0);
}
1-4. ","(콤마) 연산자
- 한번에 여러개의 수식을 차례로 나열할 때 사용함
- 우선순위가 = 보다 낮은 연산자이므로 사용할 때 정확한 동작을 위해서 괄호로 감싸는 동작 필요할 수 있음
- 이 연산자를 응용하는 여러가지 중 for문에서 ,를 사용해서 여러개 변수를 초기화해서 사용하거나 변수를 동시에 여러개 선언하는 방식으로 사용이 가능함
// for문에서의 , 사용
for (int i = 0, j = 10; i < j; i++)
{
//something code...
//이러면 i는 0 ~ 9까지 총 10번을 반복한다.
}
// 변수 선언시의 사용
int a = 10, b = 20;
//int 자료형을 한번만 선언하고 a와 b라는 변수를 초기화할 수 있다.
1-5. 조건(삼항) 연산자
- 대부분의 언어에서 유일한 삼항 연산자
- ?와 :를 함께 사용해서 표현
- 조건문이 제일 앞에 나오고 참이면 : 앞에 있는 결과가 반환되고 거짓이면 : 뒤에 있는 결과가 반환됨
// 대표적인 사용법
res = (a > b) ? a : b;
// a와 b를 비교해서 a가 b보다 더 크다면 a가 반환되고 (res에는 a값이 할당)
// 아니라면 b가 반환된다. (res에는 b값이 할당)
2. 비트 연산자
1-1. 비트 연산자 개요
- 컴퓨터는 bit라는 단위로 데이터를 저장하고 관리함
- 이 bit를 사용자가 조작할 수 있는 연산자가 비트 연산자이고 비트 논리 연산자와 비트 이동 연산자가 존재함
- 데이터를 bit로 정확하게 표현할 수 있는 정수에만 사용이 가능함!
1-2. 비트 논리 연산자
- 이항 연산자인 논리곱, 논리합, 배타논리합 연산자와 단항 연산자인 부정 연산자가 존재함
int a = 9, b = 12;
//위와 같이 변수가 선언되어 있다고 한다면
// 00000000 00000000 00000000 00001001 으로 a는 4바이트 만큼 들어가있고
// 00000000 00000000 00000000 00001100 으로 b는 4바이트 만큼 들어있다.
//보기 편하게 제일 마지막 바이트 8개만 가지고 와서 비교한다.
a & b
// 00001000 으로 8이 되고 (둘다 1일경우에만 1)
a ^ b
// 00000101 으로 5가 된다. (둘이 다를 경우에만 1)
// 앞에 0000은 1이 안되는 것으로 보아 실제 값에 해당하는 부분의 비트만 연산에 포함되는 것으로 보인다.
// 다만 부정연산자는 앞에 있는 모든 0들이 1로 변경되므로 주의
a | b
// 00001101 으로 13이 된다. (둘 중에 하나라도 1이면 1)
~a (0과 1을 뒤집음)
// 11111111 11111111 11111111 11110110 로 비트가 변한다.
1-2. 비트 이동 연산자
- 왼쪽으로 이동시키는 <<와 오른쪽으로 이동시키는 >> 가 있음
- 잘 생각해보면 비트의 위치는 2의 몇 제곱이냐로 볼 수 있음
- 즉 비트 연산은 2를 곱하거나 2를 나누는 연산으로 사용할 수 있음
- 만약 값이 양수라면 비트 이동할 떄 새로 생기는 공간은 0으로 채워지고 음수라면 오른쪽으로 이동시키는 연산은 1로 채워짐
3. 연산자 우선순위와 방향
microsoft Learn 에 보면 C에 대한 레퍼런스가 너무 잘 나와 있어서 레퍼런스 자료로 대체한다
ref : https://learn.microsoft.com/ko-kr/cpp/c-language
'Language > C' 카테고리의 다른 글
혼공C (6장) - 반복문 (while, do while, for) (0) | 2024.03.20 |
---|---|
혼공C (5장) - 선택문, 조건문 (if, else if, else, switch, case) (0) | 2024.03.20 |
혼공C (3장) - 변수와 scanf를 사용한 데이터 입력 (1) | 2023.11.28 |
혼공C (2장-기초) - printf 함수, 제어 문자, 변환 문자 (0) | 2023.07.30 |
혼공C (2장-기초) - Main함수, 주석 (0) | 2023.07.29 |