*본 포스팅은 한빛미디어의 '혼자공부하는 C언어(1판)'기준으로 작성되었습니다.
Chapter4. 연산자
3~4강을 한 글에 올리려고 하다가, 3강 정리가 생각보다 길어져서 두 부분을 나눴다.
4-1. 산술 연산자, 관계 연산자, 논리 연산자
일단 기본 배경지식으로, 1+a라는 문장이 있다면 여기서 1,a는 피연산자, +는 연산자라 한다.
산술 연산자
제일 일반적으로 아는 연산자이다. +,-,*,/,%가 있고, 특히 /는 나누기, %는 나머지를 나타낸다. 저번학기 데이터사이언스와 파이썬 수업에서 /,//,%의 차이를 간접적으로 언급한 문제가 기말고사에 나왔는데, 기초 과목이라고 방심한 고학번들이 조금 낚이지 않았을까...?하는 소박한 바람이 있었었다. 참고로 답은 파이썬 기준 /: 나누기, //: 몫, %: 나머지
예를 들어 7/2 = 3.5
7//2 = 3
7%2 = 0.5다.
대입연산자는 흔히 대입할 때 사용하는 연산자인 '='이다.
증감 연산자는 ++, --와 같이 증가나 감소를 나타낸다. a++, ++a같이 사용하며, 주로 반복문에서 사용된다.
++a는 일단 a에 1을 더하고 시작하고, a++는 증가되기 전의 원래 a 값 연산을 끝낸 후 ++를 하는 미묘한 차이가 있다. 근데 주로 a++를 많이 쓰긴 한다.
관계 연산자
==(같다), !=(다르다), <,>(대소비교)를 사용한다. 결과가 1이면 true, 0이면 false인데 나는 확률이 1이면 100퍼센트 일어난다는 의미니까 true, 확률이 0이면 false로 생각했는데 실제로 여기서 비롯되었는지는 모르겠다. 아무튼 헷깔리지 않도록 나름 외우는 방법이다.
#include <stdio.h>
int main()
{
int a= 1, b = 2, c = 1;
int result;
printf("a = %d, b = %d, c = %d\n", a,b,c);
result = (a>b);
printf("a>b : %d\n", result);
result = (a < b);
printf("a=b : %d\n", result);
result = (a == b);
printf("a==b : %d\n", result);
result = (a != b);
printf("a!=b : %d\n", result);
result = (a == c);
printf("a==c : %d\n", result);
result = (a != c);
printf("a!=c : %d\n", result);
}
==와 =가 헷깔릴 수 있는데, ==는 비교, =는 대입이다. 또, 나는 >=랑 =>를 주로 헷깔리는데 이건 다행히 컴파일 에러가 발생하긴 한다. 그런데 손코딩이면 어떻게 하냐고요? 조금 감점당해요....
논리연산자
참과 거짓에 사용되며, &&(AND), ||(OR), !(NOT)이다.
예를 들어, '코딩 좋아하세요?'라고 물으면 '!네'라고 대답하는 짤이 생각난다.
논리곱 연산자 AND는 A&&B에서 A와 B가 모두 T여야 T, 논리합 연산자 ||는 A||B에서 둘 중 어느 하나라도 T면 T다.
#include <stdio.h>
int main() {
int a = 10;
int b = 15;
int res;
//AND 연산자 중 하나만 참일 때
res = (a>10) && (b>12);
printf("(a>10) && (b>12)의 값은 %d\n", res);
//AND 연산자 중 둘 다 참일 때
res = (a<11) && (b>12);
printf("(a<11) && (b>12)의 값은 %d\n", res);
//OR 연산자 중 둘 다 거짓일 때
res = (a<11) && (b<12);
printf("(a>11) && (b<12)의 값은 %d\n", res) ;
//OR 연산자 중 하나만 거짓일 때
res = (a<11) && (b>12);
printf("(a>11) && (b>12)의 값은 %d\n", res) ;
return 0;
}
4-2. 그 외 유용한 연산자
형 변환 연산자
가끔 정수형을 실수형으로, 실수형을 문자형으로 바꿔야 할 때가 있다. 이때 사용하는 방법으로 형식은
(자료형) 피연산자 이다.
ex) (float)10 -> 10.0
(int) 12.91 -> 12
sizeof 연산자
이건 상당히 자주 사용되는 연산자다. 파이썬의 len()과 유사한 쓰임새를 가지는데, sizeof(피연산자)형식으로 사용한다.
ex) sizeof(int), sizeof(3), sizeof(a)...
복합대입 연산자
+=, -=, *=, /=, %=......연산 결과를 다시 피연산자에 저장한다. 주의해야 할 점은, 컴퓨터 구조 부분이 조금 들어가서 이해하기 어려울 수도 있지만 저장되는 공간과 연산되는 공간이 다르다는 점이다.
조건 연산자
?, :로 참인가? 거짓인가?를 나타내는 연산자이다.
#include <stdio.h>
int main() {
int a = 0, b = 1, res;
res = (a>b) ? a:b;
printf("더 큰 값: %d", res);
//결과: 더 큰 값: 1
return 0;
}
이처럼 '(수식) ? 변수1:변수2;' 로 나타내는데, 풀어서 쓰자면 수식이 맞다면 변수1, 틀리다면 변수2를 맨 앞에 지정한 변수에 대입한다.
비트 연산자
비트 연산자는 데이터를 비트 단위로 연산하는데, >>, <<같은 비트 이동 연산자와 &,|,^같은 비트 논리 연산자가 있다. 그런데 사실 이 부분은 꽤 고난도 코딩이기도 하고, 포인터를 배운 후 학습하는게 더 학습효과가 좋기 때문에 지금 시점에서는 이런게 있구나 정도만 해도 될 것 같다. 참고로 전공자 3학년 1학기까지 마친 경험 상 지금까지 사용된 경우는 시험+무수한 과제 통틀어서 딱 2번 사용했고, 그나마도 비중 있게 쓰지는 않아서 이 부분이 막혔다면 그냥 넘어가자.
*기본미션(3강, p. 81~82)
이상으로 2주차 학습 분량인 3~4강 완료!
4강 미션(p.118~119)
#include <stdio.h>
//118페이지 1번
int main() {
int res;
res = (sizeof(short)>sizeof(long)) ? "short":"long";
printf("%s", res);
return 0;
}
#include <stdio.h>
//118페이지 2번
int main() {
int seats = 70, audience = 65; //좌석 수, 관중 수 초기화
double rate ;
rate = ((double)audience/(double)seats)*100;
printf("입장률: %.1lf%%", rate);
// 입장률: 92.9%
return 0;
}
#include <stdio.h>
//119페이지 3번
int main() {
int hour, min, sec; //변수 선언
double time = 3.76; //주어진 시간
double time2 = 3.76;
hour = time/1;
//printf("%d", hour);
time = time-hour; //time에서 3시간 빼기
time = time*60; //남은 시간을 분으로 바꾸기
min = time/1;
// printf("%d", min);
time = time-min; //time에서 45분 빼기
time = time*60; //남은 시간을 초로 바꾸기
sec = time;
printf("%.2lf시간은 %d시간 %d분 %d초입니다.", time2, hour, min, sec);
return 0;
}
p. 120 추가미션
#include <stdio.h>
//120페이지 추가미션
int main() {
int kg;
float cm, bmi, m;
printf("몸무게(kg)와 키(cm) 입력: ");
scanf("%d%f", &kg, &cm); //중요 - %d%f 사이에 띄어쓰기 없음
m = cm/100;
bmi = kg/(m*m);
printf("%s\n", ((20.0 < bmi && bmi< 25.0) == 1) ? "정상입니다":"체중관리가 필요합니다");
return 0;
//주의해야 할 점: C는 20.0<bmi<25.0같이 한번에 비교 연산자 여러개 사용 불가능 - &&연산자 활용
//결과:
//몸무게(kg)와 키(cm) 입력: 66 189.8
//체중관리가 필요합니다
}
추가 미션에서 배운게 많았다. 정리하자면
1. scanf 여러개 받을 때는 scanf("%d%f", &a, &b)처럼 띄어쓰기 없음
2. 12<a<15같이 여러개 사용 불가능하므로 &&연산자로 묶어야 한다. 안묶으면 12<a만 적용되어서 예상과는 다른 결과가 출력된다.
'혼공학습단 C' 카테고리의 다른 글
C언어 W5(8강 배열) (0) | 2023.08.08 |
---|---|
C언어 W4(7강 함수) (0) | 2023.07.24 |
C언어 W3(5 ~ 6강) (0) | 2023.07.20 |
C언어 W2-1 (3강) (0) | 2023.07.11 |
혼공학습단 10기 C언어 W1 (0) | 2023.07.06 |