From Evernote: |
[C] 0x05 연산자(Operator) |
오늘은 C언어에서 연산에 대한 부분에 대해서 이야기해보자!!
연산자는 수학책에서 많이 본 + - * / 이런 녀석들인데
C언어에서는 이런 연산자를 용도에 따라 구분을 해두었다.
= 산술연산자 = (+ - * / %)
일반적으로 수학책에서 많이 본 부호들이닷 + - * / %
/ 와 % 에서 의아하게 생각할 수 있는데 각각 용도가 다르다
/ 는나눗셈을 했을때의 몫을 계산해주는 연산자이다.
%는나눗셈을 했을 때 나머지를 계산해주는 연산자이다.
=> 단 주의할 점은 실수는 %(나머지 연산자)를 사용하지 않는다.
왜냐하면 실수에서는 정수와 달리 소숫점아래자리까지 표현을 해주기 때문에
나머지라는 개념이 없다.
= 대입연산자 = ( = )
a = b ; // b값을 a에 저장하는 것이다.
= 복합 대입 연산자 =( += , -= ...)
a += b; // a와 b를 더한 후 그 결과값을 a에 대입을 해주는 것이다.
= 증감연산자 =( ++ , -- )
: 저장된 데이터를 1 증가(감소) 시켜준다.
- 전치(Prefix) 연산 : ++a , --a
- 후지(Postfix) 연산 : a++, a--
전치는 연산 전에 저장된 Data를 증가(감소) 시켜주고, 후치는 연산 후에 저장된 Data를 증가(감소)시킨다.
=> 즉 변수값이 언제 변하는지 그 차이일 뿐이다.
ex) a=5;
b= ++a + 3;
연산순서 1 2
a 값을 먼저 1증가(5->6)시켜준 뒤 6+3 을 계산한 값인 9를 b에 넣어준다. => 전치 연산
ex) a=5;
b= a++ + 3;
연산순서 2 1
5 + 3 을 계산한 값 8을 b에 넣어준다. 그 뒤 a의 값을 1증가(5->6)시켜준다.
전치와 후치를 잘 이해했다면 아래의 퀴즈(?)를 한 번 풀어봅시당 ㅎㅎ. 프로그램으로 짜서 돌리면 반칙이에요 ㅋㅋ
그냥 방금전에 이해한 전치 연산과 후치 연산을 이용해서 머리로 계산을 해봅시다
Quiz) b값은 무엇일까요?
a = 5;
b = ++a + ++a;
=> 12 ? 13 ? 이라고 생각하십니까? 이렇게 생각했다면 땡!! 정답은 14입니다.
읭? 무슨소리? 라고 생각하는 분들을 위해 연산과정에 대해서 알아봅시다.
b = ++a + ++a;
1 3 2
=> 1,2 모두 전치 연산자라는 것을 확인할 수 있다. 그래서 3 보다 먼저 연산이 되는 것이다.
1 을 연산하면 5->6 이된다. 이 값이 현재 a 에 저장되어있는 것이다.
그리고 2 에 나온 a 는 같은 줄에 있다고 5->6이 되는 것은 아니다.
이미 1에서 a 값이 5-> 6으로 증가되었기 때문에 2에서는
증가된 a 값 6을 전치연산하는 것이다. 그 결과 6->7로 된 것이다.
지금 여기까지만 듣고 13 이겠구나 하고 생각할 수 있다. 하지만 중간에 값이 결정되는 것은 아니다.
그리고 1, 2 모두 동일한 a 값을 이야기 하는 것이다.
그러므로 1 , 2 전치연산 결과 7이라는 값이 들어간다.
그래서 3에서는 7 + 7 을 연산해서 b 값이 14가 되는 것이다.
(*정리* : ++a , a = a + 1 , a += 1 ) 모두 같은 연산이라는 것!!
= 관계(비교)연산자 =( < , > , <= , >= , == , != )
: 수치를 구하는 연산자가 아니라 True, False (논리)를 판별하는 연산자이다.
그리고 True = 1 // False = 0 이 된다. (참고로 False = 0 이다. 0을 제외한 모든 값은 True 로 판별된다는 사실)
= 논리연산자 =( &&(and) , ||(or) , !(not) )
:여러 개의 조건을 동시에 검사를 한다.
= 그 밖의 연산자 =
- sizeof() : 메모리의 크기를 byte 단위로 구하는 연산자
- 형변환(캐스트) 연산자 : DataType을 일시적으로 변환하는 연산자이다.
ex) int a;
double b;
b = a; // 자동형변환
| |
double int // double은 8byte 공간 int는 4byte 공간이므로 int를 double에 넣을 수 있다.
그렇다면 그 반대의 경우는?
a = b;
| |
int double // 4byte 공간인 int 에 8byte 크기를 가지는 double형 Data를 집어 넣는 것이다.
=> Wanrnig이 발생한다. 즉, Error는 아니고 가능은 한 것이다.
작은공간에 큰 것을 집어 넣는 것이므로 Data 소실이 발생할 수 있다.
b = ( double ) a; //강제형변환
= 삼항연산자 =(조건 ? 참 : 거짓;)
: 위에 적어 둔 것 처럼 연산을 3개의 구문으로 처리하는 것이다.
ex) int a = 5, b=2;
a > b ? printf("a가 크네요") : printf("b가 크네요");
| | |
해당 조건이 | |
참이면 a가 크네요 출력 거짓이면 b가 크네요 출력
max = a > b ? a : b ;
a 가 클경우 max = a;
b 가 클경우 max = b;
=> 이렇게 사용할 수 도 있다.
'Computer Engineering' 카테고리의 다른 글
[C] 0x07 조건문(Switch) (0) | 2012.01.13 |
---|---|
[C] 0x06 조건문(if) (0) | 2012.01.12 |
[C] 0x03 DataType(자료형) (0) | 2012.01.09 |
[C] 0x02 컴파일러(Compiler) , 링커(Linker), 이스케이프 문자열(Escape Sequence) ... (0) | 2012.01.06 |
[C] 0x01 (0) | 2012.01.05 |