▩ 연산자
1. 정수 연산자 원리
정수/정수 = 정수
정수/실수 = 실수
실수/정수 = 실수
실수/실수 = 실수
- 작은 데이터 타입과 큰 데이터 타입의 경우 항상 작은 데이터 타입은 큰 데이터 타입으로 흡수
된다.
>>>>> 기본 연산자
#include <stdio.h>
void main() {
int a=10, b=3;
printf("%d + %d = %d\n", a, b, a+b);
printf("%d - %d = %d\n", a, b, a-b);
printf("%d * %d = %d\n", a, b, a*b);
printf("%d / %d = %d\n", a, b, a/b);
//특수문자의 출력은 2번 연속해서 입력합니다.
printf("%d %% %d = %d\n", a, b, a%b);
}
2. 증가/감소 연산자
- 일반 2항연산자보다 처리속도가 빠릅니다.
- ++a, a++의 개념
a = a + 1;
- --a, a--의 개념
a = a - 1;
- a = ++b;
b = b + 1;
a = b;
- a = b--;
a = b;
b = b - 1;
>>>>> 증가 연산자
#include <stdio.h>
void main() {
int a=30, b=30;
printf("원래 a의 값 : %d\n", a);
printf("원래 b의 값 : %d\n", b);
printf("++a의 결과 : %d\n", ++a);
printf("++연산 후의 값 : %d\n", a);
printf("b++의 결과 : %d\n", b++);
printf("++연산 후의 값 : %d\n", b);
}
>>>>> 감소 연산자
#include <stdio.h>
void main() {
int a=30, b=30;
printf("원래 a의 값 : %d\n", a);
printf("원래 b의 값 : %d\n", b);
printf("--a의 결과 : %d\n", --a);
printf("--연산 후의 값 : %d\n", a);
printf("b--의 결과 : %d\n", b--);
printf("--연산 후의 값 : %d\n", b);
}
>>>>> 상수에 대한 연산은 에러를 발생시킨다.
#include <stdio.h>
#include <conio.h>
void main() {
int a=10;
printf("++(10)=%d\n", ++(10));
getch();
}
>>>>> 권장이 되지 않는 예제
//팀원간 소스분석에 지연 시간이 발생합니다.
//개발후 유지보수에 많은 시간이 소모됩니다.
//소스는 간결하고 분석이 용이해야 합니다.
#include <stdio.h>
#include <conio.h>
void main() {
int a=10;
int b=10;
printf("(++a - ++a)+(++b)=%d\n", (++a - ++a)+(++b));
getch();
}
3. 할당 연산자
- +=, -=, *=, /=
- 연산 속도의 증가가 사용 목적
- a += b;
a = a + b;
>>>>> 할당 연산자
#include <stdio.h>
void main() {
int a=10, b=3;
printf("원래 a의 값 : %d\n", a);
printf("%d + %d의 값 : %d\n", a, b, a+=b);
printf("변경된 a 값 : %d\n",a);
printf("%d - %d의 값 : %d\n", a, b, a-=b);
printf("변경된 a 값 : %d\n",a);
printf("%d * %d의 값 : %d\n", a, b, a*=b);
printf("변경된 a 값 : %d\n", a);
printf("%d / %d의 값 : %d\n", a, b, a/=b);
printf("변경된 a 값 : %d\n", a);
}
4. 관계 연산자(비교 연산자)
<, <=, >, >=, ==, !=
- 관계 연산자는 참인 경우는 0 이외의 값, 기본 값은 1, 거짓인 경우는 0의 값이 리턴된다.
- bool 타입이 없습니다.
. 참: 0 이외의 모든 값은 참입니다. 따라서 -100도 참 입니다.
. 거짓: 0만 거짓입니다.
#include <stdio.h>
void main() {
int a=10, b=15;
printf("%d > %d : %d\n", a, b, a>b);
printf("%d >= %d : %d\n", a, b, a>=b);
printf("%d < %d : %d\n", a, b, a<b);
printf("%d <= %d : %d\n", a, b, a<=b);
printf("%d == %d : %d\n", a, b, a==b);
printf("%d != %d : %d\n", a, b, a!=b);
}
>>>>> 두개의 수를 입력받아 앞의 수가 크면 1, 그렇지 않으면 0을 출력하는 프로그램
#include <stdio.h>
void main() {
int a, b;
printf("첫번째 수를 입력하세요. : ");
scanf("%d", &a);
printf("두번째 수를 입력하세요. : ");
scanf("%d", &b);
printf("%d > %d의 결과는 %d입니다.\n", a, b, a>b);
}
5. 논리 연산자
!, &&, ||, &, |
>>>>>>>>>> 비트 and, or 연산자
#include <stdio.h>
main(){
printf("10 | 3=%d\n", (10 | 3));
printf("10 & 3=%d\n", (10 & 3));
}
/*
0000 1010
+0000 0011
----------
0000 1011 --> 11
0000 1010
&0000 0011
----------
0000 0010 --> 2
*/
>>>>>논리 연산자
#include <stdio.h>
void main() {
int a=10, b=15, c=5, d=20;
printf("%d>%d => %d\n", a, b, a>b);
printf("%d<%d => %d\n", a, b, a<b);
printf("%d<%d => %d\n", c, d, c<d);
printf("!(%d<%d) => %d\n", c, d, !(c<d));
printf("(%d>%d) && (%d<%d) => %d\n", a, b, c, d, (a>b)&&(c<d));
printf("(%d>%d) || (%d<%d) => %d\n", a, b, c, d, (a>b)||(c<d));
printf("(%d<%d) && (%d<%d) => %d\n", a, b, c, d, (a<b)&&(c<d));
printf("(%d<%d) || (%d<%d) => %d\n", a, b, c, d, (a<b)||(c<d));
printf("!(0)=> %d\n", !(0));
printf("!(1)=> %d\n", !(1));
printf("!(-100)=> %d\n", !(-100));
}
>>>>> 비트 연산자
#include <stdio.h>
void main() {
int a=0XD1, b=0XC4;
printf("%X => %d\n", a, a);
printf("~%X => %X\n", a, ~a);
printf("%X => %d\n", b, b);
printf("~%X => %X\n", b, ~b);
printf("%X & %X => %X\n", a, b, a&b);
printf("%X | %X => %X\n", a, b, a|b);
printf("%X ^ %X => %X\n", a, b, a^b);
}
/*
11010001
& 11000100
----------
00010101 ==> 21 ==> 15
10진수 16진수
*/
>>>>> 이동연산자
- 왼쪽으로의 이동은 무조건 2배합니다.
- 오른쪽으로의 이동은 무조건 나누기2합니다.
- 2진수는 자리이동에따라 2배가 되던지, 그렇지 않으면 나누기 2배가 됩니다.
0000 1000 ---> 8
0001 0000 ---> 16
0010 0000 ---> 32
#include <stdio.h>
void main() {
int a=0XD1, b=0XC4;
printf("원래의 값 : 10진수(%d), 16진수(%X)\n", a, a);
printf("1번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 1, a << 1);
printf("2번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 2, a << 2);
printf("3번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 3, a << 3);
printf("4번 왼쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", a << 4, a << 4);
printf("\n");
printf("원래의 값 : 10진수(%d), 16진수(%X)\n", b, b);
printf("1번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 1, b >> 1);
printf("2번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 2, b >> 2);
printf("3번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 3, b >> 3);
printf("4번 오른쪽 이동한 값 : 10진수(%d), 16진수(%X)\n", b >> 4, b >> 4);
}
/*
0 0 0 0 0 0 0 0
----------------------
12864 32 16 8 4 2 1
*/