21/12/30
0. 연산자의 우선순위
- 연산을 할 때 가장 먼저 계산되는 것 ~ 가장 나중에 계산되는 순서
- 1 + 1 * 2 = 3 ( 곱셈먼저 계산 )
- (1 + 1 ) * 2 = 4 ( 괄호먼저 계산 )
- 순서
- () ⇒ 증감, !, (포인터), &(주소) ⇒ 사칙연산(, /, % ⇒ +, -) ⇒ 시프트 ⇒ 비교 ⇒ 비트 ⇒ 논리(&&, ||) ⇒ 대입
1. 산술연산자 (+, -, *, /, %)
- 사칙연산
- % : 나머지
- 사용법
1
printf("%d",35%5);
결과 : 0
- 사용법
2. 증감연산자 (++, –)
- 피연산자를 1씩 증가 또는 감소
- 연산자의 위치에 따라 증감시점이 달라지므로 유의!
- ++a : a 증가시킨 후 연산
- a++ : 연산 후 a 증가
ex 1)
1
2
3
4
int a, b;
a = 4;
b = ++a * ++a;
- ++a(1) * ++a(2) 연산순서
- (1) a = 4 + 1
- (2) a = 5 + 1
- b = 6 * 6
∴ a = 6, b = 36
- ++a : 연산보다 우선순위가 높으므로 ++먼저 계산
ex 2)
1
2
3
4
int a, b;
a = 10;
b = a++ - a--;
- a++(1) - a--(2) 연산순서
- b = 10 - 10
- (1) a = 10 + 1
- (2) a = 11 - 1
∴ a = 10, b = 0
- a++ : 연산 후 계산
ex 3)
1
2
3
4
5
int a, b, c;
a = 3;
b = 2;
c = ++a + b++;
- ++a + b++ 연산순서
- a = 3 + 1
- c = 4 + b++
- c = 4 + 2
- b = 2 + 1
∴ a = 4, b = 3, c = 6
ex 4)
1
2
3
4
5
int a, b, c;
a = 3;
b = 2;
c = a++ + ++b;
- a++ + ++b 연산순서
- c = 3 + ++b
- b = 2 + 1
- c = 3 + 3
- a = 3 + 1
∴ a = 4, b = 3, c = 6
3. 대입연산자 (=, +=, -=, …)
사용법
1
2
3
4
5
6
7
int a = 25;
a += 3; // a = a + 3
printf("%d\n", a);
a -= 3; // a = a - 3
printf("%d\n", a);
결과
28
25
4. 비교연산자 (>, =>, <, <=, ==, !=..)
- 두 값의 비교
==: 두 값이 같은가?- != → 부정!
- a != 9 » a는 9가 아니다
1 2 3 4 5 6 7
int num = 9; if(num != 9) { printf("거짓!"); // num이 9가 아닐 경우 실행 } else { printf("참!"); // num이 9가 아닌것 이외일 경우(num이 9라면) 실행 }
결과 : 참!
- a != 9 » a는 9가 아니다
5. 논리연산자 (&&, ||, !)
1) !
- 부정!
- 논리 뒤집기!
- 참! = 거짓
- 거짓! = 참
- 1! = 0 (거짓)
- 0! = 1 (참)
- 컴퓨터 언어에서 0 이외의 숫자는 모두 참(True)
- 따라서 3! = False 22! = False
2) &&
- 거짓이 하나라도 있으면 false(F)
- 거짓 을 찾은 순간 뒤의 조건은 더이상 확인하지 않음
조건식 거짓유무 결과 T&&F O F F&&T O F T&&T X T
3) ||
- 참이 하나라도 있으면 true(T)
- 참 을 찾은 순간 뒤의 조건은 더이상 확인하지 않음
조건식 참유무 결과 T||F O T F||T O T F||F X F
4) &&, || 조건이 3개 이상
- ex )
- T && F && T;
- { ( T && F ) && T } ⇒ { ( F ) && T } ⇒ F
- F || T || F;
- { ( F || T ) || F } ⇒ { ( T ) || F } ⇒ T
- T || F && T;
- { ( T || F ) && T } ⇒ { ( T ) && T } ⇒ T
- F && F || T;
- { ( F && F ) || T } ⇒ { ( F ) || T } ⇒ T
- T && F && T;
6. 비트연산자 (&, |, ~, ^)
1) ~
- 단항연산자
- 1의 보수로 변환
- 1011 » 0100
- 0010 » 1101
2) ^
- 이항연산자
- 두 항의 값이 다르면 T, 같으면 F
- T ^ F = T
- F ^ T = T
- T ^ T = F
- F ^ F = F
3) &, |
- | : 정보추가
- & : 정보추출
- ex) 좌석 예약(long x)
미예약 : 0, 예약석 : 1
좌석32 … 좌석4 좌석3 좌석2 좌석1 0 … 0 0 0 0
좌석3 예약 : x = 4
좌석32 … 좌석4 좌석3 좌석2 좌석1 0 … 0 1 0 0 좌석1 예약 : x = x | 1
0...0100 + 0...0001 ------------ 0...0101
좌석32 … 좌석4 좌석3 좌석2 좌석1 0 … 0 1 0 1 - x = 1 » 0…0001 (이전 데이터는 사라지고 새로운데이터(x=1)가 저장됨)
좌석1 예약확인 :
1 2 3 4 5
if ( x & 1 ) { // x와 1 모두 T(1)인가? printf("예약되었습니다."); } else { // x가 F(0)인가? printf("예약되지 않았습니다."); }
좌석32 … 좌석4 좌석3 좌석2 좌석1 0 … 0 1 0 1 0 … 0 0 0 1 - … - - - T - x에 1이 있는지 확인하고 결과 출력
- 결과 : 예약되었습니다
7. 시프트연산 («, »)
- 비트 연산자
1) «
- 비트 전체를 왼쪽으로 이동
- 사용법
1 2
int b = 0110 1010; printf("%d",b<<2);
0110 1010
0110 1010 «2칸 왼쪽으로 이동
결과: 1010 1000- 밖으로 나간 비트는 제거, 비어있는 부분은 0으로 채워짐
2) »
- 비트 전체를 오른쪽으로 이동
<<와 반대
8. 간접연산자 (*)
- 포인터에 사용하는 연산자
- 아직 포인터를 배우지 않았음으로 대충 이해한대로 정리하자면
- ‘*변수’의 주소 내용을 참조
- 사용법 참조
1 2 3 4 5
int *ptr; int num = 10; ptr = num; printf("%d",*ptr);
결과: 10
9. 주소연산자 (&)
- 변수의 주소를 알려주는 연산자
- 변수마다 고유의 주소를 가지고 있음 ⇒ 주소만으로 특정 변수를 알 수 있음(컴퓨터가)
- 사용법
1 2 3 4 5
int x = 5; scanf("%d\n",&x); // scanf("포맷", 변수 주소); int arr[3] = {1, 2, 3}; scanf("%d",arr);
결과
5
arr`address- scanf() : 변수주소를 사용하지 않으면 에러!
- 인덱스 미지정 배열 출력 결과 : 변수의 주소
10. 형변환연산자 ( (변환할 타입) )
- 명시적 형변환
- 정확히 어떤 데이터타입으로 변할지 지정해 주는 것
묵시적 형변환1 2
int x = 5; float y = x; // int가 암묵적으로 float로 변경됨
- 명시적 형변환
- 사용법
1 2
int x = 5; float y = (float)x; //int를 float로 지정
- 형변환 시 주의할 점
- 작은 타입 » 큰 타입 (괜찮음)
- 큰 타입 » 작은 타입 (결과가 달라질 수 있음)
- int x = (int)3.1; » x = 3
- 연산자의 우선순위에 의해 결과가 달라질 수 있음
- ( float ) 100 / 3 = 33.3333333
- ( float ) ( 100 / 3 ) = 33.0000000
11. 삼항연산자 (조건 ? 참 : 거짓;)
- 세 개의 항으로 이루어진 연산자
- 사용법
1 2
// ( 조건 ) ? 참 : 거짓; (3 == 4) ? printf("True") : printf("False");
결과 : False
12. 괄호연산자 ( (), [], {} )
- 우선순위가 가장 높은 연산자
- 우선순위를 잘 모르겠다면 괄호로 순서를 정하는것도 좋음
Comments powered by Disqus.