06. 연산자 우선순위
07. 관계/논리연산자, 조건문
08. 논리연산자, 증감연산
09. 산술연산자
10. 출력형식
06. 연산자 우선순위
ㅁ 연산자 우선순위(자바나 c나 같음)
- 괄호, 단항, 곱하기나누기, 더하기빼기, ~~~~, 논리연산자(&&, II), 대입연산자
ㅁ 연산자 우선순위 예시
- Int a=3, b=4, c=5, d=6;
(1) a*b+c >= d && d/a-b != 0 =
왼쪽: 17 >= 6 여기서 >= 비교연산자임. 17이 6이상이냐. 맞으므로 1이 됨.
오른쪽: 2-4 != 0 여기서 -2와 0이 같지 않으니 참임. 1.
답은 1이 된다.
(2) d%b + ++a*c-- =
2 + 20이므로 22.
6 나누기 4는 몫은 1이고 나머지는 2다.
ㅁ 아래 c프로그램의 출력은?
#include<stdio.h>
int main(){
int a=5, b=5;
a *= 3 + b++;
printf("%d %d", a, b);
return 0;
}
a *= 3 + b++; 여기서 연산자 우선순위가 제일 낮은건 *=이다.
고로 a *= 8++;이므로 a는 40, b는 6이됨.
07. 관계/논리연산자, 조건문
ㅁ 모든 프로그램의 조건문은 if와 switch가 있다.
ㅁ 관계연산자 종류
10 == 9 결과값 0
3 != 3 결과값 0
5 > 5 결과값 0
5 >= 5 결과값 1
7 < 7 결과값 0
7 <= 7 결과값 1
ㅁ 논리 연산자 종류
(논리부정) !9 결과값 0 (!a는 a가 참이면 거짓, 거짓이면 참)
(논리곱) 3>=3 && 3>3 결과값 0
(논리합) 5>5 II 5>=5 결과값 1
ㅁ 단순 if문
if(조건) {
조건이 만족할때의 처리;
}
조건이 만족하면 수행하고 만족안하면 if문의 {}블럭 자체를 수행 안함.
ㅁ if ~ else문
if(조건) {
조건이 만족할때의 처리
}
else{
조건이 아닐때의 처리
}
ㅁ 다중 if문
if(조건1) {
조건1이 만족할때의 처리
}
else if(조건2) {
조건2가 만족할때의 처리
}
else{
조건이 아닐때의 처리
}
조건1이 만족하면 else if와 else는 수행 안 함.
ㅁ 문제
if문의 && 왼쪽: 거짓. 그리고 i는 4, j는 3이된다.
if문의 && 오른쪽: 이미 왼쪽이 거짓이므로 아예 실행되지 않음
if문이 true일 때 실행할 블록: if문의 조건이 거짓이므로 아예 실행되지 않음
j = 4-- - --3; 이므로 j는 4-2=2.
그리고 i는 3이되고 j는 2가 된다.
ㅁ 참고
if 에서 다중 조건으로 식1, 식2 이런식으로 있을때, 식 1에서 대입이 있을경우, 식 2에서 변경된 값으로 처리가 됩니다.
int i = 1;
if( i++ >= 1 && i++ >= 2 ) {
printf("1 : %d", i);
}
현재 and 조건이고, i >=1 은 참이 됩니다.
그리고 i값을 2로 변경이 되지요. 그 이후에 i >= 2 이 비교를 수행한후 참이 나오고, i 값은 3이 됩니다.
출력결과는 1 : 3 이됩니다.
int i = 1;
if( i++ >= 1 || i++ >= 2 ) {
printf("1 : %d", i);
}
or 조건으로 변경해보겠습니다. 첫번째 i >= 1은 참이고, i 값은 2가 됩니다. 그 이후에 뒤에 조건은 참고를 하지 않습니다. 왜냐면 or 는 하나만 만족하면 되기 때문에 컴파일러가 더이상 자원을 소모하지 않기 때문입니다.
&&는 왼쪽이 거짓이면 오른쪽을 수행하지 않음.
II는 왼쪽이 참이면 오른쪽을 수행하지 않음.
ㅁ 참고2
int i=3, j=4;
if( (++i > j--) && (i++ < --j) II (++i > ++j) )
{ i = i-- + ++j; }
else
{ j = i-- - --j; }
printf("%d\n", i);
이런 경우, 만약 &&왼쪽이 참이고 &&오른쪽이 참이면, II 오른쪽은 검사 안한다.
지금은 &&왼쪽이 거짓이므로 &&오른쪽은 실행 안함. II 오른쪽은 검사 한다.
답 5아니고 10이다.
ㅁ 단항연산자는 대입의 의미까지 포함을 한다.
08. 논리연산자, 증감연산
ㅁ 문제
9, 3, 0, 8, 2
09. 산술연산자
ㅁ 문제
x = 3, y = 9
ㅁ 문제
num = 6 + 14%5/2 - 2*2;
답. 4
순서대로 한다.
ㅁ 문제
int a = 10, b = 20;
num = (a++ == 11) && (b++ == 20);
답. 0
10. 출력형식
ㅁ 출력 변환기호
- %d는 정수와 문자를 출력함. 문자는 뭐냐. A의 아스키 코드는 65. %d에 A 넣으면 65가 나옴.
ㅁ 출력형식 예시
(1) printf("값1 : %d, 값2 : %d', 10, 5);
- printf. 출력함수는 인자값이 무조건 있어야 한다. 처섭ㄴ째 인자는 그대로 출력. %d는 출력 변환기호.
그러니 그 뒤에 있는 인자들을 순서대로 매칭.
- 출력결과. 값1 : 10, 값2 : 5
(2) printf("값 : %c", 65);
- 출력결과. 값 : A
(3) printf("값 : %c", A);
- 출력결과. 값 : A
(4) printf("값 : %s", "안녕하세요.");
- 출력결과. 값 : 안녕하세요.
- 포인터값(주소값)을 받는 경우도 있음.
(5) printf("값 : %x", 34);
- 34를 16진수로 표현하라. 10진수를 16진수나 8진수로 변환하기 이전에 먼저 2진수로 변환함.
- 100010 (2진수)
- 16진수는 4개씩 자름.
8 4 2 1 8 4 2 1
0 0 1 0 0 0 1 0 = 22가 됨.
(6) printf("값 : %o", 34);
- 8진수는 3개씩 자름.
4 2 1 4 2 1
1 0 0 0 1 0 = 42가 됨.
ㅁ 정수형 자리수 지정
(1) printf("값 : %d", 13);
- 출력결과. 값 : 13
(2) printf("값 : %5d", 13);
- 5개의 공간을 만들고 오른쪽부터 채우겠다는 것.
ㅁ ㅁ ㅁ ㅁ ㅁ
1 3
(2) printf("값 : %05d", 13);
- 5개의 공간을 만들고 오른쪽부터 채우는데 빈곳은 0
ㅁ ㅁ ㅁ ㅁ ㅁ
0 0 0 1 3
ㅁ 실수형 자리수 지정
(1) printf("값 : %f", 3.26);
- 실수같은 경우는 소수점 아래로 6자리가 붙는다.
- 출력결과. 값 : 3.260000
(2) printf("값 : %6.1f", 3.26);
- 6개의 공간을 만들고, 소수점 아래로는 1개만 표현하겠다(반올림함).
ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ
3 . 3
(3) printf("값 : %-6.1f", 3.26);
- 마이너스는 왼쪽부터 출력하라는 것이다.
ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ
3 . 3
(3) printf("값 : %-6.3f", 3.26);
- 6개의 공간을 만들고, 마이너스니까 왼쪽부터 채우고, 소수점 아래로는 3자리를 표현한다.
ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ
3 . 2 6 0
ㅁ 문제
d_value = 6.15
정수형인 n에 실수형인 d_value를 그냥 집어넣을 수 없으니 int로 형태를 변환한다. 이 때 소수점 아래는 버린다.
n = 6
출력결과. 6.2 , 6
'깨알 c언어' 카테고리의 다른 글
깨알 c언어 ch.26 ~ 30 (0) | 2024.03.08 |
---|---|
깨알 c언어 ch.21 ~ 25 (0) | 2024.02.22 |
깨알 c언어 ch.16 ~ 20 (0) | 2024.02.22 |
깨알 c언어 ch.11 ~ 15 (0) | 2024.02.22 |
깨알 c언어 ch.1 ~ 5 (1) | 2024.02.21 |