C언어 개념 정리: 수식과 연산자
4.1 수식과 연산자 개요
1. 연산자
- 데이터를 가공하고 처리하기 위한 가장 기본 도구
- 연산 종류에 따른 분류: 산술 연산자, 관계 연산자, 논리 연산자, 증감 연산자, 비트 연산자, 대입 연산자, 조건 연산자 등
- 피연산자 개수에 따른 분류: 단향 연산자, 이항 연산자, 삼항 연산자
2. 수식
- 피연산자들과 연산자의 조합으로 어떠한 값을 갖는 요소
3. 산술 연산자
- +, -, *, /, %
- 정수 연산 >> /: 몫, %: 나머지
- 부동소수 연산 >> /: 나누기
4.. 정수의 자릿수 구하기
- 1의 자릿수 계산
>>>코드
int n = 2715;
printf("일의 자릿수: %d\n", n %10);
- 백의 자릿수 계산
>>>코드
int n = 2715;
printf("백의 자릿수: %d\n", n / 100 % 10);
4.2 산술 연산자
1. 연산 순서
- 연산자 우선 순위: *, /, %는 +, - 보다 먼저 적용
- 적용 순서를 변경하고자 하는 경우 소괄호 사용
- 결합 수칙: 왼쪽에서 오른쪽 방향으로 적용
2. 산술 연산과 자료형
- 연산 결과도 자료형이 먼저 정해져 있어야 함
- 산술연산의 경우 피연산자의 자료형에 따라 연산 결과값의 자료형이 결정됨
예시)
- 정수형과 정수형 => 정수형
- 부동소수형과 부동소수형 => 부동소수형
- 정수형과 부동소수형 => 부동소수형 >> 정보 손실 방지
- 앞의 규칙은 연산자 별로 적용
- 앞의 규칙은 변수에도 동일하게 적용
- 피연산자가 모두 정수형인데, 부동소수 연산을 하고 싶으면 명시적 형변환 사용
4.3 대입 연산자
1. 대입 연산자 =
- 연산자 오른쪽 수식의 값을 왼쪽 변수에 대입(수학의 등호와 다른의미)
2. 연속 대입
- 대입 연산의 결과는 왼쪽 변수에 저장되는 값 >> 이를 이용하여 대입을 연속적으로 진행 가능
예시)
a = b = c = 2; // 해당 문장의 의미는 아래의 코드와 동일하다
>> 오른쪽 부터 수행함의 주의
c = 2;
b = c;
a = b;
3. 복합 대입 연산자: 대입 연산자와 산술 연산자의 결합
- a += x >> a = a + x
- a -= x >> a = a - x
- a *= x >> a = a * x
- a /= x >> a = a / x
- a %= x >> a = a % x
4. 증감 연산자
- 변수의 값을 1씩 증가(++) 혹은 감소(--) 시키는 단항 연산자
- 변수의 앞에 오느냐 뒤에 오느냐에 따라 수식의 해석이 달라진다.
- ++a : a의 값 1증가 >> a의 값 사용
- --a : a의 값 1감소 >> a의 값 사용
- a++ : a의 값 사용 >> a의 값 1증가
- a-- : a의 값 사용 >> a의 값 1 감소
4.4 관계 연산자
- 왼쪽과 오른쪽의 대소 관계를 비교하는 연산자
- 연산의 결과는 참 아니면 거짓으로, 참이면 1, 거짓이면 0
(C언어에서 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. 관계 연산자와 산술 연산자의 우선 순위
- 관계 연산자의 우선순위는 산술 연산보다 낮음
- 산술 계산 먼저 >> 계산된 값 비교
3. 연속된 관계 연산자의 의미
- 4 < 5 < 2 의 경우 C언어에서의 의미
>> (4 < 5) < 2 // 4 < 5의 결과는 참으로 1
>> 1 < 2
>> 1 // 결과는 참
- 만약 수학식 4 < 5 < 2의 의미를 표현하고 싶다면 4 < 5 && 5 < 2 로 표현해야 맞다.
4.5 논리 연산자
1. 논리 연산자
- 논리 연산 값으로 참이면 1이고 거짓이면 0
(0을 제외한 모든 값은 참으로 간주)
- !x : 논리 부정(not) >> x가 참이면 거짓(0), x가 거짓이면 참(1)
- x && y : 논리 곱(and) >> x, y 둘다 참이면 참(1), 둘 중 하나라도 거짓이면 거짓(0)
- x || y : 논리 합(or) >> x, y 중 하나라도 참이면 참(1), 둘다 거짓이면 거짓(0)
2. 논리 연산자의 연산 순서
- 우선 순위 : ! > && > || (논리 부정 > 논리 곱 > 논리 합)
- 우선 순위가 같은 경우 왼쪽부터 계산
- 우선 순위를 무시하려면 괄호 사용
3. 논리 연산자와 관계/ 산술 연산자의 우선순위
- && 와 || 의 우선 순위는 관계/ 산술 연산자보다 낮음
- 그러나, ! 의 우선 순위는 관계/ 산술 연산자보다 높음
4.6 그 외 연산자
1. 조건 연산자
- if ~ else 문을 대신하여 사용할 수 있는 연산자
- 피연산자 수가 3개인 삼항 연산자
- 조건 ? A : B
>> 조건이 true일 경우, 결과 값은 A
>> 조건이 false일 경우, 결과 값은 B
2. 콤마 연산자: 여러 수식을 하나의 문장으로 표현할 때 사용
a = b+3;
b = 2;
b += a;
>> 하나로 묶기
a = b+3, b = 2, b += a;
3. sizeof 연산자: 저장공간의 크기를 바이트 단위로 계산
- sizeof(char) >>> 결과 값 1
- sizeof(3.14) >>> 결과 값 8
- sizeof(3) >>> 결과 값 4
4. 형변환 연산자: 명시적 형변환을 위해 사용 >> (자료형)
4.7 연산자 우선순위와 결합수칙
1. 연산자 우선순위
- 여러 연산자가 함께 사용된 경우 우선 순위에 의존
- 다른 순서로 연산을 하고 싶은 경우 괄호를 사용
2. 결합 수칙
- 연산의 순서를 나타냄
- 연산자 우선 순위가 같은 경우 결합수칙에 의존
>>> 순위
1) 멤버 연산자 >> (), [], ., -> : 왼쪽 우선
2) 단항 연산자 >> 부호 +, 부호 -, ++, --, !, ~, 간접참조 *, & 주소, sizeof(자료형) : 오른쪽 우선
3) 산술 연산자 >> 곱하기 *, /, % : 왼쪽 우선
4) 산술 연산자 >>더하기 +, 뺴기 - : 왼쪽 우선
5) 이동 연산자 >> <<, >> : 왼쪽 우선
6) 관계 연산자 >> <, >, <=, >= : 왼쪽 우선
7) 관계 연산자 >> ==, != : 왼쪽 우선
8) 논리 연산자 >> 비트곱 & : 왼쪽 우선
9) 논리 연산자 >> ^ : 왼쪽 우선
10) 논리 연산자 >> | : 왼쪽 우선
11) 논리 연산자 >> && : 왼쪽 우선
12) 논리 연산자 >> || : 왼쪽 우선
13) 조건 연산자 >> ? : 오른쪽 우선
14) 대입 연산자 >> =, +=, -=, *=, %=, /=, ^=, <<=, >>= : 오른쪽 우선
15) 콤마 연산자 >> , : 왼쪽 우선
3. 주요 연산자 우선순위
- 산술 >> 관계 >> 논리 >> 대입 연산 순