본문 바로가기
혼공학습단 C

C언어 W2-2(4강)

by 알래스카코코넛 2023. 7. 13.
반응형

*본 포스팅은 한빛미디어의 '혼자공부하는 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강 완료!

3강 미션

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