[C언어] 7. 연산식과 연산자

이번에는 C언어의 연산식과 연산자에 대해 알아보자.





연산식과 연산자

연산식과 연산자 용어정리

1) 용어정리

3 + 4

//3, 4 : 피연산자
//+ : 연산자
//3 + 4 : 연산식, 표현식, 수식
//결과값 7
  • 연산식(expression) 👉 변수 / 다양한 리터럴 상수 / 함수의 호출로 구성되는 표현식, 항상 하나의 결과값을 가짐

  • 연산값 👉 연산식의 결과값

  • 연산자(operator) 👉 이미 정의된 연산을 수행하는 문자(문자조합) 기호

  • 피연산자(operand) 👉 연산에 참여하는 변수나 상수, 평가하여 항상 하나의결과값을 가짐



2) 연산자

연산에 참여하는 피연산자의 갯수에 따라연산자의 위치에 따라
단항(단일항; unary) 연산자 : + - => 부호전위(prefix) 연산자 : ++a
이항(binary) 연산자 : + - * / => 사칙연산후위(posfix) 연산자 : a++
삼항(teranry) 연산자 : 조건연산자 ? :  





연산자의 종류

산술연산자와 부호연산자

1) 산술연산자

연산자의미참고
+더하기(addiction)피연산자 정수형, 실수형
-빼기(subtraction)피연산자 정수형, 실수형
*곱하기(multiplication)피연산자 정수형, 실수형
/나누기(division)▫️ 정수 % 정수 => 소수부분을 버린 정수
▫️ 실수%정수 => 소수
%나머지(remainder, modulus)피연산자 정수(실수면 오류)


2) 부호연산자

  • + - : 피연산자의 부호를 나타내는 연산자

(축약)대입연산자와 증감연산자

1) 대입연산자(assignment operator

  • 연산자 오른쪽 결과값을 왼쪽 변수에 저장하는 연산자
  • L-value = R-value (L-value <- R-value)

2) 축약대입연산자

  • += -= *= /= %=
a += b;
//a = a + b;


3) 증감연산자

 전위(prefix)후위(postfix)
증가(++)++aa++
감소(- -)- -aa- -


  • 전위연산자
  • 후위연산자



관계연산자

1) 관계연산자

  • 두 연산자의 크기를 비교하기 위한 연산자
  • 관계연산자자의 연산값: 참이면 0 거짓이면 1
  • 피연산자 : 정수형, 실수형, 문자형(아스키코드)
연산자연산식의미
>x>yx가 y보다 큰가?
>=x>=yx가 y보다 크거나 같은가?
<x<yx가 y보다 작은가?
<=x<=yx가 y보다 작거나 같은가?
!=x!=yx와 y가 다른가?
==x==yx와 y가 같은가?



논리연산자

1) 논리연산자

  • and : && 👉 모두 참(!=0)이어야 결과가 참(1)
  • or : || 👉 하나만 참(!=0)이어도 결과가 참(1)
  • not : != 👉 거짓(0)이면 참(1) 반환, 참(!=0)이면 거짓(0) 반환


2) 참과 거짓

  • 참: 거짓이 아니면 참
  • 거짓: 0 0.0 \0


3)단축 평가

  • 단축평가란(short circuit evaluation)? 왼쪽 피연산자만으로 논리연산 결과가 결정된다면 오른쪽 피연산자는 평가하지 않는 것
int sale = (amount >= 10000) && (coupons++ >= 10);

//amount < 10000 일 경우, 
//(coupons++ >= 10)는 판단하지 않고 바로 sale = 0 대입



조건연산자

1) 조건연산자란? 👉 조건에 따라 주어진 피연산자가 결과값이 되는 삼항연산자

조건 ? 참일때 : 거짓일때
char ch = (a > b) ? 'a' : 'b'



비트연산자

1) 비트연산자

  • C언어는 정수의 비트 중심(bitwise) 연산자를 제공함
  • 비트연산자의 종류 : 비트 논리 연산자, 비트 이동연산자


2-1) 비트논리 연산자

  • 피연산자 정수 값을 비트 단위로 논리연산을 수행하는 연산자
  • 종류: 전위단항연산자(~), 이항연산자(% | ^)
  • 피연산자의 자료형 : char int long long long
  • 각 피연산자를 int형으로 변환하여 연산, 결과 int
연산자이름예시의미
&bit AND(AND 연산자)op1 & op2비트가 모두 1이면 1
|bit OR(OR 연산자)op1 | op2비트가 하나만 1이면 1
^bit XOR(배타적 OR 연산자)op1 ^ op2비트가 서로 다르면 1
~bit complement(NOT/보수 연산자)~op1비트가 0이면 1, 1이면 0


2-2) 비트 이동연산자

  • 연산자의 방향인 왼쪽이나 오른쪽으로, 비트단위로 줄줄이 이동시키는 연산자
연산자이름예시의미
>>bit shift RIGHTop1 >> op2가장 왼쪽 비트인 부호비트를 원래의 부호 비트로 채워서 이동
<<bit shift LEFTop1 << op2가장 오른쪽 비트를 모두 0으로 채움


형변환 연산자

1) 형변환이란(type cast, type conversion) 👉 필요에 따라 자료의 표현방식을 바꾸는 것

  • 자료형 크기의 범주 변화에 따른 구분
    • 올림변환: 작은 범주의 자료형에서 큰 범주인 자료형으로의 형변환 방식
    • 내림변환: 큰 범주의 자료형에서 보다 작은 범주인 자료형으로의 형변환 방식
  • 자료형 변환 구분 방식
    • 명시적(강제) 형변환: 소스에서 직접 형변환 연산자를 사용하는 방식
    • 묵시적(자동) 형변환: 컴파일러가 알아서 자동으로 수행하는 방식


1-1) 올림변환과 내림변환

  • 올림변환(promotion)
    • 형 넓히기
    • 산술연산에서 피연산자의 자료형이 다른 경우 자동 올림변환
    • 정보의 손실이 없으므로 컴파일러가 올림변환 => 묵시적 형변환
  • 내림변환
    • 대입연산에서 저장되는 변수의 자료형과, 저장 값의 자료형이 다르면 자동 내림변환
    • 묵시적 내림변환의 경우 정보의 손실이 발생할 수 있어 경고 발생


1-2) 명시적 형변환과 묵시적 형변환

  • 묵시적 형변환(implicit type conversion): 컴파일러가 알아서 자동으로 수행하는 방식
    • 올림변환: 정보의 손실이 없음
    • 내림변환: 정보의 손실이 발생할 수 있어 경고 발생, 명시적 형변환이 필요
  • 명시적 형변환(exlicit type conversion): 형변환 연산자(type cast)를 사용해 뒤에 나오는 피연산자의 값을 괄호에서 지정한 자료형으로 변환하는 방식
    • 예시: int i = (int)double_value;
    • 내림변환이나 올림변환 모두 이용가능


sizeof연산자

1) sizeof연산자란?

  • 연산값, 변수, 자료형의 저장장소의 크기를 구하는 연산자
  • 결과값: 바이트 단위의 정수
sizeof 상수나 변수
sizeof (상수나 변수)

sizeof 연산식, 연산값
sizeof (연산식, 연산값)

sizeof (자료형)


콤마연산자

1) 콤마연산자 ,

  • 왼쪽과 오른쪽 연산식을 각각 순차적으로 계산하고, 결과값은 가장 오른쪽에서 수행한 연산의 결과
3 + 4, 5 - 10           //-5
3 + 4, 5 - 10, 2 * 3    //6

//연산자 우선순위: 대입연산자 > 콤마연산자
x = 3 + 4, 2 * 3        //x = 7, 6





연산자 우선순위와 결합성

연산자 우선순위 규칙

  • 규칙 1) 괄호우선규칙: 괄호가 있으면 먼저 계산
  • 규칙 2) 연산자 우선규칙: 연산자의 우선순위에 따라 계산
  • 규칙 3) 연산자 결합성: 괄호가 없고, 같은 우선순위면 일반적으로 왼쪽에서 오른쪽으로 연산, 일부는 오른쪽에서 왼쪽으로 => 계산방향



C언어 연산자 우선순위

우선순위연산자설명분류결합성(계산방향)
1()
[]
.
->
a++ a--
함수호출
인덱스
필드(유니온) 멤버 지정
필드(유니온)포인터 멤버 지정
후위증가, 후위감소
단항->
2++a --a
!~
sizeof
-+
&
*
전위증가, 전위감소
논리 NOT, 비트 NOT(보수)
변수, 자료형, 상수의 바이트 단위 크기
음수 부호, 양수 부호
주소
간접, 역참조
단항<-
3(형변환)형변환단항<-
4* / %곱하기 나누기 나머지산술->
5+ -더하기 빼기산술->
6>> <<비트 이동이동->
7< > <= >=대소비교관계->
8== !=동등비교관계->
9&비트 AND 또는 논리 AND비트->
10^비트 XOR 또는 XOR비트->
11|비트 OR 또는 논리 OR비트->
12&&논리 AND(단락계산)논리->
13||논리 OR(단락계산)논리->
14?:조건조건<-
15== += -= *= /= %=
<<= >>= &= |= ^=
대입대입<-
16,콤마콤마->