C언어에서의 식(Expression)은 수학에서의 수식과 비슷합니다. 수학에서 1 + 2 = 3 으로 계산하듯이 C언어에서 비슷한 방식으로 표현을 합니다. C언어에서도 비슷한 방식으로 표현합니다.

 

예).

sum = value1 + value2;

의 형식으로 표현하며, 수학에서 = 는 같다는 의미라면 C언어에서는 =는 뒤의 데이터를 앞의 변수에 대입하라는 대입 연산자입니다. 수학에서 =는 C언어에서는 ==로 표현합니다.

 


피연산자의 수에 따른 분류

연산에 필요한 피연산자의 갯수에 따라서 단항연산자, 이항연산자, 삼항연산자로 분류할 수 있습니다.

 

단항 연산자(unary operator) 

[피연산자][연산자]
ex).
    a++
    a--

[연산자][피연산사]
ex).
    ++a
    --a
    ~a 

 

이항 연산자(binary operator)

피연산자1] [연산자] [피연산자2]
ex).
    a + b
    a = b
    a == b

 

삼항 연산자(ternary operator)

피연산자1] [연산자] [피연산자2] [연산자] [피연산자3]
ex).
    a > 0 ? b : c  

 


기능에 따른 분류

연산자에는 산술연산자(수치계산), 대입연산자, 비교연산자, bit 연산자 등 다양한 연산자가 있습니다.

 

 

산술연산자

연산자(기호) 설명 피연산자 예제 비고
+ 덧셈 이항 a + b  
- 뺄셈 이항 a - b  
* 곱셈 이항 a * b 곱하기 연산자는 × 모양 대신 *를 사용함
/ 나눗셈 이항 a / b 만약 정수간의 나눗셈이면 소숫점이하가 없는 몫
% 나머지 이항 a % b 정수형간에만 사용 가능하다

 


 

부호 연산자

연산자(기호) 설명 피연산자 예제 비고
+ 1을 곱함 단항

b = +a;

+는 값에 변화가 없음

- -1을 곱함 단항

b = -a;

-는 기존의 값에 대해서 부호를 바꾸는 역할 

 


 

증감연산자

연산자(기호) 설명 피연산자 예제 비고
++ 증가 연산자 단항

++a

a++

++a는 ++를 만나자마자 바로 1증가함

a++는 문장이 끝날 때 즉, 세미콜론(;)을 만나면 1 증가함

-- 감소 연산자 단항

--a

a--

--a는 --를 만나자마자 바로 1감소함

a--는 문장이 끝날 때 즉, 세미콜론(;)을 만나면 1 감소함

 

예제).

int value = 100;

printf("value = %d\n", ++value);

value = 100;
printf("value = %d\n", value++);

결과:
value = 101
value = 100

증감연산자는 일반 데이터(정수형, 실수형)의 경우는 값을 1증가 또는 1감소 시키지만, Ponter의 경우에는 데이터 type의 sizeof( )만큼의 메모리 번지를 이동시킵니다.

 


 

비교 연산자

연산자(기호) 설명 피연산자 예제 비고
== 같은지?  이항 if(a == b) 비교한 값이 같으면 1, 그렇지 않으면 0
!= 같지 않은 지? 이항 if(a != b) 비교한 값이 다르면 1, 그렇지 않으면 0
> 큰지? 이항 if(a > b) 좌측의 값이 크면 1, 그렇지 않으면 0
>= 크거나 같은지? 이항 if(a >= b) 좌측의 값이 크거나 같으면 1, 그렇지 않으면 0
< 작은지? 이항 if(a < b) 좌측의 값이 작으면 1, 그렇지 않으면 0
<= 작거나 같은지? 이항 if(a <= b) 좌측의 값이 작거나 같으면 1, 그렇지 않으면 0

비교 연산자는 if ~ else, while 등에서 로직의 분기, 로직 처리 여부를 판단하는 용도로 주로 사용됩니다.

 

 


 

논리 연산자

연산자(기호) 설명 피연산자 예제 비고
&& AND 이항    
|| OR 이항    
! NOT 단항    

C언어에서는 true, false의 기준은 값 또는 수식의 결과가 0이면 false, 그렇지 않으면 true입니다. 

 

 


 

Bit 연산자

연산자(기호) 설명 피연산자 예제 비고
~ NOT 단항 b = ~a; a의 데이터에서 각각의 bit에 대해 0은 1로, 1은 0으로 바꿈
& AND 이항 c = a & b; 두 데이터의 같은 위치의 bit를 비교하여 모두 1인 경우에는 그 bit를 1로, 그렇지 않으면 0으로 연산한 결과를 return함
| OR 이항 c = a | b; 두 데이터의 같은 위치의 bit를 비교하여 모두 0인 경우에는 그 bit를 0으로, 그렇지 않으면 1로 연산한 결과를 return함
^ XOR 이항 c = a ^ b; 두 데이터의 같은 위치의 bit를 비교하여 서로 다른 값이면 1, 그렇지 않으면 0으로 연산한 결과를 return 함
<< 상위 bit로 shift 이항 c = a << 2; 데이터의 전체 비트를 상위 bit로 이동하고 이동하고 빈곳은 0으로 채움
>> 하위 bit로 shift 이항 c = a >> 2; 데이터의 전체 비트를 하위 bit로 이동하고 이동하고 빈곳은 0으로 채움

bit 연산자는 데이터를 bit 단위로 계산을 하기 위한 연산자입니다. 일반적으로는 많이 사용하지 않지만, 암복호화 관련 처리 등에서는 필수적으로 사용되는 연산자입니다. 또한 파일의 권한 등이 bit 단위로 관리되고 있어서 특정한 권한을 추가하거나 뺴거나 하는 등의 경에 사용될 수 있습니다.

 


 

대입 연산자

연산자(기호) 설명 피연산자 예제 비고
= 대입 이항 a = b; b의 값을 a에 대입
+= 더한 후 대입 이항 a += 4; a = a + 4; 와 같음. a 자신에 4를 더라하는 의미
-= 뺀 후 대입 이항 a -= 2; a = a - 2; 와 같음. a 자신에 2를 빼라는 의미
*= 곱한 후 대입 이항 a *= 2; a = a * 2; 와 같음. a 자신에 2를 곱하라는 의미
/= 나눈 후 대입 이항 a /= 2; a = a / 2;와 같음. a 자신에 2를 나눈 다음에 a에 저장
%= 나머지만 대입 이항 a %= 10; a = a % 10;과 같음. a 자신에서 10으로 나눈 나머지를 저장
&= & bit 연산후 대입 이항 a &= b; a = a & b;와 같음
|= | bit 연산후 대입 이항 a |= b; a = a | b;와 같음
^= ^bit 연산후 대입 이항 a ^= b; a = a ^ b;와 같음
<<= << 연산후 대입 이항 a <<= 2; a = a << 2;
>>= >> 연산 후 대입 이항 a >>= 2; a = a >> 2;

 

 


 

기타 연산자

연산자(기호) 설명 피연산자 예제 비고
. 멤버 참조 이항 a.age = 10; struct, union의 member를 지정하는 연산자
-> 멤버 간접 참조 이항 a->age = 10; struct, union가 pointer 변수일 때에 member를 지정하는 연산자
* 간접 참조 단항 v = *(ptr+1) pointer의 값
& 주소 연산자 단항 &i 변수의 주소 정보
[ ] 배열 이항 a = arr[1]; 배열의 값
( ) 괄호 연산자 단항 (a + b) * 3 주로 연산자가 간의 우선 순위를 조정하기 위한 목적으로 사용하는 연산자
(type) type cast 이항 a = (int)b; 데이터 type을 다른 
sizeof 데이터 크기 단항 a = b[2]; 배열
, 나열 연산자 이항 a = b, b = c 여러 개의 식을 나열하고 결과는 마지막 수식의 return 값
? : 조건 연산자 삼항 a = (b>0) ? 1 : 0:  조건식 ? 참일때 : 거짓일때

 

예제)

    int max;
    int data1 = 100;
    int data2 = 200;

    max = (data1 > data2) ? data1 : data2;  // data1이 크면 data1을 그렇지 않으면 data2
는
    if(data1 > data2) {
        max = data1;
    } else {
        max = data2;
    }
와 같은 의미입니다.

 


연산자 우선 순위

구분 연산자 결합규칙
괄호 연산자 ( )  
type casting, 배열, 멤버, 후위 증감 ( type)  [ ]  .  ->  ++  -- 왼쪽 → 오른쪽
전위 증감, 단항 연산자 ++  --  !  ~  +  -  *  &  sizeof 오른쪽 왼쪽
곱하기, 나누기, 나머지 *  /  %  왼쪽 → 오른쪽
더하기, 빼기 +  - 왼쪽 → 오른쪽
Shift 연산자 <<   >> 왼쪽 → 오른쪽
비교 연산자 >   <   >=   <=    왼쪽 → 오른쪽
등가 연산자 ==   != 왼쪽 → 오른쪽
bit AND & 왼쪽 → 오른쪽
bit XOR ^ 왼쪽 → 오른쪽
bit OR | 왼쪽 → 오른쪽
논리 AND && 왼쪽 → 오른쪽
논리 OR || 왼쪽 → 오른쪽
조건 연산자 ? : 오른쪽  왼쪽
대입 연산자 =  +=  -=  *=  /= %= >>= <<=  &=   ^=  |= 왼쪽 → 오른쪽
나열 연산자 , 왼쪽 → 오른쪽

연산자의 우선순위는 둘 이상의 연산자가 연속할 경우에 어떤 연산자 부터 먼저 연산을 하느냐를 결정을 하는 우선 순위입니다.  

int  a = 10, b = 20, c = 30;
int  value;

value = a + b * c++;

위의 식에서 연산자 우선 순위에 따라서 잘못된 계산이 발생할 수 있습니다.  기본적인 우선 순위를 알고 있어야 되겠지만, 헷깔리는 경우가 발생하면 가장 높은 우선의 연산자인 ( )연산자를 이용하여 묶어주면 모든 것이 정리가 됩니다. 

 

 

 

C Programming Language 문법

1. C 프로그래밍 언어는? 2. C언어 개발 환경 (실습 환경) 3. C언어의 컴파일 과정 4. C 소스 파일 구성 5. 주석문(Comment) 6. 식별자 명명 규칙 7. C 프로그래밍의 시작 - 함수 8. 변수와 상수 (정수형) 9. 변..

www.it-note.kr

 

 

 

블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

Tag ,

댓글을 달아 주세요

  • 김민성 2019.12.21 15:33  댓글주소  수정/삭제  댓글쓰기

    "피연산자의 수에 따른 분류" 에서 삼항연산자의 영어 표기에 오타가 있어 댓글 작성합니다.
    binary --> ternary

    "기능에 따른 분류" 에서 증감 연산자 코드 하단 부분.
    ponter --> pointer

    "기타 연산자" 에 기입된 표에서 "(type), sizeof" 에 해당하는 비고 부분에 내용이 누락되었습니다.

    감사히 잘보고 있습니다. ^^