3) 연산자
* 연산자
- 데이터를 사용자가 원하는 형태로 가공하기 위해서 연산자를 사용한다
C언어는 연산자를 다양하게 많이 지원한다
* 연산자의 종류
1. 산술연산자
사칙연산 + - * / (몫연산자) %(나머지연산자)
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));
printf("%d % %d = %d\n",a,b,(a%b));
2. 비교연산자 (관계연산자)
< > <= >=
결과값을 맞다 1, 틀리다 0 으로 반환해준다
0 false
1 true
C언어는 0과 \0문자만 거짓이고 다 참값이다.
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));
3. 논리연산자 (판단)
- 판단을 하면 맞다, 틀리다라는 형태로 되돌려 준다
- 판단을 해야하는 조건이 2개이상일때 판단을 한다
- 어떤 임의의 정수가 짝수이면서 5의 배수인지 확인
- 논리곱 연산자 && and, 그리고 연산자
- 논리합 연산자 || or, 또는 연산자
- 부정연산자 ! Not 연산자
printf("%d\n",((a<0) && (b<0)));
printf("%d\n",((a<0) || (b<0)));
printf("%d\n",(!((a<0) || (b<0)));
문) 변수 a가 가지고 있는 값이 짝수이면서, 5의 배수인지 확인
- 짝수란? 2로 나누어서 나머지가 0 인 값
- 5의 배수란? 5로 나누어서 나머지가 0인 값
printf("%d\n",(a%2==0)&&(a%5==0));
문) 변수 b가 2의 배수이거나, 3의 배수인지 확인
printf("%d\n",(b%2==0)||(b%3==0));
* 연산자의 우선순위
() -> 산술 -> 비교 -> 논리 -> 대입
--------------------------
* shift 연산자 (이동)
- bit 단위로 연산
- left shift <<
대상값*2^n (n은 이동 bit수)
print("%d << %d = %d\n",a,b,(a<<b));
- right shift >>
대상값/2^n
printf("%d >> %d = %d\n",a,b,(a>>b));
----------------------
*2진수(0~1), 8진수(0~7), 10진수(0~9), 16진수(0~9,ABCDEF)
printf("%d %o %x\n",10,10,10);
printf("%d %d %d\n",10,010,0x10);
-----------------------
* 비트연산자
<< >> ~ (1의 보수연산자)
& (비트곱)
| (비트합)
printf("%d\n",~9);
----------------------
1. 단항연산자
printf("%d %d\n",a*-1, -a);
2. 이항연산자
3. 삼항연산자
(조건) ? 참 : 거짓
문) 변수 a가 가지고 있는 값이 음수인지, 양수인지 확인
- 음수란 ? 0보다 작은값
- 양수란 ? 0보다 큰값
(a<0) ? printf("음수") : printf("양수");
문) 변수 a, b중에서 큰수를 출력
(a<b) ? printf("%d",b) : printf("%d",a);
문) 세개의 정수중에서 제일 큰 수 출력
int p=5, q=6, r=8;
int max;
//(p<q) ? max=q : max=p;
max=(p<q) ? q : p;
//(max<r) ? max=r : max=max;
max=(max<r) ? r : max;
printf("max=%d\n",max);
------------------------------
* 1증가 연산자
int idx=5;
printf("idx=%d\n",idx);//5
idx=idx+1;
printf("idx=%d\n",idx);//6
idx+=1;
printf("idx=%d\n",idx);//7
idx++;
printf("idx=%d\n",idx);//8
++idx;
printf("idx=%d\n",idx);//9
* 1감소 연산자
int num=5;
num=num-1;
printf("num=%d\n",num);
num-=1;
printf("num=%d\n",num);
num--;
printf("num=%d\n",num);
--num;
printf("num=%d\n",num);
----------------------------
* 대입연산자
int su=10;
su=su+5;
printf("su=%d\n",su); //15
su+=5;
printf("su=%d\n",su); //20
su*=5; //su=su*5
printf("su=%d\n",su); //100
su/=5; //su=su/5
printf("su=%d\n",su); //20
su%=5; //su=su%5
printf("su=%d\n",su); //0
----------------------------------------
#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));
printf("%d %% %d = %d\n",a,b,(a%b));
printf("%d %% %d = %d\n",b,a,(b%a));
*/
/*
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));
*/
/*
printf("%d\n",((a<0) && (b<0)));
printf("%d\n",((a<0) || (b<0)));
printf("%d\n",(!((a<0) || (b<0)));
*/
/*
printf("%d\n",((a%2==0)&&(a%5==0)));
printf("%d\n",(b%2==0)||(b%3==0));
*/
/*
printf("%d << %d = %d\n",a,b,(a<<b));
printf("%d >> %d = %d\n",a,b,(a>>b));
printf("%d %o %x\n",10,10,10);
printf("%d %d %d\n",10,010,0x10);
printf("%d\n",~9);
*/
/*
printf("%d %d\n",a*-1, -a);
(a<0) ? printf("음수") : printf("양수");
(a<b) ? printf("%d",b) : printf("%d",a);
*/
/*
int p=5, q=6, r=8;
int max;
//(p<q) ? max=q : max=p;
max=(p<q) ? q : p;
//(max<r) ? max=r : max=max;
max=(max<r) ? r : max;
printf("max=%d\n",max);
*/
int idx=5;
printf("idx=%d\n",idx);//5
idx=idx+1;
printf("idx=%d\n",idx);//6
idx+=1;
printf("idx=%d\n",idx);//7
idx++;
printf("idx=%d\n",idx);//8
++idx;
printf("idx=%d\n",idx);//9
int num=5;
num=num-1;
printf("num=%d\n",num);
num-=1;
printf("num=%d\n",num);
num--;
printf("num=%d\n",num);
--num;
printf("num=%d\n",num);
int su=10;
su=su+5;
printf("su=%d\n",su); //15
su+=5;
printf("su=%d\n",su); //20
su*=5; //su=su*5
printf("su=%d\n",su); //100
su/=5; //su=su/5
printf("su=%d\n",su); //20
su%=5; //su=su%5
printf("su=%d\n",su); //0
}
* 1 증감연산자
- 단독으로 쓰이면 연산자가 변수명 앞에 있든, 위에 있든 상관이 없다
- 단, 1증감연산자가 대입연산자와 함께 사용될때는
앞에 있는 경우와 뒤에 오는 경우를 정확히 구분해서 사용할 것
++idx 먼저 1증가
idx++ 나중에 1증가
int a=10,b=20,c,d;
/*
c=++a; //a=a+1 -> c=a
d=b--; //d=b -> b=b-1
printf("%d %d %d %d\n",a,b,c,d);
각각의 변수에 어떤 값이 있는지 확인?
a=11
b=19
c=11
d=20
*/
int z;
z=++a * b--; //a=a+1 -> z=a*b -> b=b-1
//a=11 z=11*20 b=19
printf("%d\n",z);
-------------------------
문) 각각의 지폐의 갯수를 확인
int money=52430;
int m,c,b,s;
m=money/10000; //m=52430/10000
money=money%10000; //money=2430
c=money/1000; //c=2430/1000
money=money%1000; //money=430
b=money/100;
money=money%100;
s=money/10;
printf("만원 %d장\n",m);
printf("천원 %d장\n",c);
printf("백원 %d장\n",b);
printf("십원 %d장\n",s);
----------------------------
문) 1년 365.2422 일
365일 ?시간 ?분 ?초
1분 60초
1시간 60초*60분=3600초
1일 24시간*3600초=86400초
1년 86400초*365.2422
int days=365.2422;
days=365.2422*86400; //1년이 ?초
int d,h,m,s;
d=days/84600; //365
days=days%86400;
h=days/3600;
days=days%3600;
m=days/60;
s=days%60;
printf("%d일 %d시간 %d분 %d초\n",d,h,m,s);
* 형변환
1. 자동형변환
- 자료형의 크기가 큰거 따라감
- 정수형/실수형 -> 결과가 실수형임
2. 강제형변환 (cast연산자)
- 사용자의 필요에 의해 자료형을 변환한다. 일시적으로 사용된다
- (자료형)값
- (int)3.4
printf("%d\n",(int)(3.6+3.6)); //7
printf("%d\n",(int)3.4+(int)3.4); //6
-------------------------
* unsigned int : 음수값을 대입하면 쓰레기값이 들어간다
* unsigned long
* 반드시 양수값만 존재하는 값을 표현할때 사용하면 된다
예)달력
- 임의의 정수값을 %3으로 나누면 나올수 있는 나머지의 종류 0 1 2
- 임의의 정수값을 %5으로 나누면 나올수 있는 나머지의 종류 0 1 2 3 4
- 임의의 정수값을 %45으로 나누면 나올수 있는 나머지의 종류
0, 1, 2,....43, 44
--------------------------