Week 04
< 180411 >
Week 04
1) 1의 보수, 2의 보수.
- 10은 2진수로 00001010 (8비트 기준)
- 1의 보수를 취하면 11110101 이 된다. (0은 1로, 1은 0으로)
- 2의 보수는 1의 보수의 결과에 1을 더하면 된다. 11110110
>> 2의 보수의 결과는 -10이 된다.
>> 검증 : -1은 11111111 이다. 여기에서 9인 00001001 을 빼면 11110110 이 된다.
2) 삼항연산자( ? 연산자)
- 삼항 연산자의 폼은 (조건식) ? 식1 : 식2; 이다.
- 조건식의 결과는 참 혹은 거짓이다.
- 조건식의 결과가 참이면 식1이, 거짓이면 식2가 수행된다.
3-1) 두 수를 입력받아, 두수의 차이의 절대값을 출력하는 프로그래밍
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { int a, b; scanf("%d%d", &a, &b); printf("%d\n", a > b ? a-b : b-a); return 0; } | cs |
3-2) 세 수를 입력받아, 가장 큰값과 가장 작은 값을 출력하는 프로그래밍
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int a, b, c; int max, min; scanf("%d%d%d", &a, &b, &c); max = a > b ?(a > c ? a : c) : (b > c ? b : c); min = a < b ?(a < c ? a : c) : (b < c ? b : c); printf("%d %d\n", max, min); return 0; } | cs |
>> 중첩된 삼항연산자 이해해보기..!!
4) 조건식에서의 참과 거짓.
- 거짓은 0으로 표현된다.
- 참은 0이 아닌 모든값, 즉 0이 아닌 모든 정수값이 된다.
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main() { 0 ? printf("A") : printf("B"); 1 ? printf("A") : printf("B"); 13 ? printf("A") : printf("B"); -2 ? printf("A") : printf("B"); return 0; } | cs |
>> 실행결과 : BAAA
5) && 연산자
- (조건식) && (조건식) 의 형태를 이룬다.
- 두 조건식이 참이면 참이 된다.
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main() { 1 && 1 ? printf("A") : printf("B"); 1 && 0 ? printf("A") : printf("B"); 0 && 1 ? printf("A") : printf("B"); 0 && 0 ? printf("A") : printf("B"); return 0; } | cs |
>> 실행결과 : ABBB
6) 문자 하나를 입력받아, 해당 문자가 알파벳 대문자인지 판단하는 프로그래밍.
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char ch; scanf("%c", &ch); 'A' <= ch && ch <= 'Z' ? printf("TRUE") : printf("FALSE"); return 0; } | cs |
>> 아스키코드값의 특징, && 의 특징, 삼항연산자를 쓸 줄 알면 풀 수 있는 문제이다.
7) || 연산자.
- (조건식) || (조건식) 의 형태를 가지며, 두 조건식 중 하나의 조건식만 참이면 참이 된다.
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main() { 1 || 1 ? printf("A") : printf("B"); 1 || 0 ? printf("A") : printf("B"); 0 || 1 ? printf("A") : printf("B"); 0 || 0 ? printf("A") : printf("B"); return 0; } | cs |
>> 실행결과 : AAAB
8) 대입연산자
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { int a, b; a = b = 0; printf("%d %d\n", a, b); return 0; } | cs |
>> 6 번 라인을 보자. b = 0; 이라는 식은 b 에 0을 대입하고, 그 식 자체의 결과는 또한 0이 된다.
>> 그렇기 때문에 a = b = 0; 은 a = (b = 0); 에서 a = (0); 으로 이어지며,
>> 결과적으로 a 와 b 두 변수 모두에 0이 대입된다.
9) || 연산의 단축연산
- 아래의 프로그래밍의 실행결과를 에측해보자.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int a, b; a = b = 0; (a = 5) || (b = 3) ? printf("A") : printf("B"); printf(" %d %d\n", a, b); return 0; } | cs |
10) ! 연산자 (NOT 연산자)
- 참을 거짓으로, 거짓을 참으로 만드는 연산자 이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main() { int a=0; int b=3; !a ? printf("A") : printf("B"); !b ? printf("A") : printf("B"); !0 ? printf("A") : printf("B"); !1 ? printf("A") : printf("B"); return 0; } | cs |
>> 실행결과는 ABAB
11) Shift 연산자 >>, <<
- << 는 비트단위로 왼쪽으로 한칸씩 밀어낸다.
- >> 는 비트단위로 오른쪽으로 한칸씩 밀어낸다.
- 10을 2진수로 표현하면 00001010 이다.
- a = 10; a = a >> 1; 이 수행되면, 00000101 이 된다. 즉 a 에는 5가 저장지며, 결과적으로 2로 나눈 몫이 된다.
- a = 10; a = a << 1; 이 수행되면, 00010100 이 된다. 즉 a 에는 20이 저장되며, 결과적으로 2가 곱해진 결과가 된다.
- a = 10; a = a >> 2; 가 수행되면 a 는 2가 된다.
- a = 10; a = a << 2; 가 수행되면 a 는 40이 된다.
12) 기타.
- 콤마연산자
- 연산자 우선순위
- 단항, 2항, 3항, 대입, 콤마 연산자.
- 컴퓨터는 뺄셈, 곱셈, 나눗셈을 보수를 이용해서 덧셈으로 처리한다는 내용. >> 10 - 3 => 10 + (-3)
- 나눗셈의 경우에 피제수와 보수를 더하여 100이 될 때까지 더해진 횟수가 몫이 된다는 내용
>> Self...^^