학이시습

[혼공C] 2주차_연산자 알아보기 본문

혼공학습단/혼공C

[혼공C] 2주차_연산자 알아보기

dbswndud 2024. 1. 14. 03:46

Chapter 4

01. 산술 연산자, 관계 연산자, 논리 연산자

산술 연산자와 대입 연산자

산술 연산자

산술 연산자는 수학에서도 만히 사용되며(+, - 등), 컴퓨터에서는 가장 중요한 명령어입니다.

산술 연산자에는 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)가 있습니다.

모두 2개의 피연산자를 사용합니다.

 

대입 연산자

대입 연산자는 =기호를 사용합니다.

오른쪽 수식의 결과를 왼쪽 변수에 저장합니다.

 

나누기 연산자와 나머지 연산자

나누기는 / 연산자를 사용합니다.

정수로 연산할 때는 몫을 구하고, 실수로 연산할 때는 소수점까지 구합니다.

 

증감 연산자

증감 연산자를 사용해서 a = a + 1을 ++a로 표현할 수 있습니다.

 

전위 표기와 후위 표기

증감 연산자의 위치를 ++a처럼 피연산자 앞에 놓이면 전위 표기(prefix), 뒤에 놓이면 후위 표기(postfix)라고 합니다.

전위 표기는 증감하고 나서 연산에 사용하고 후위 연산자는 연산하고 나서 값이 증감합니다.

 

관계 연산자

관계 연산자에는 관계 대소 연산자와 동등 관계 연산자가 있습니다.

관계 대소연산자는 < 또는 > 등의 기호를 사용하고 동등 관계 연산자는 ==(같다)나 !=(같지 않다)를 사용합니다.

 

논리 연산자

논리 연산자는 참과 거짓을 판단하는 데 사용하며 &&(AND), ||(OR), !(NOT)가 있습니다.

 

숏 서킷 롤

숏 서킷 롤은 좌항만으로 &&와 ||연산 기능을 판별하는 기능입니다. 불필요한 연산을 줄여 실행속도를 높입니다.

&&와 ||연산자는 숏 서킷 롤이 적용됩니다.

&&는 좌항이 거짓이면 우항과 관계없이 결과는 거짓이므로 우항을 볼 필요가 없습니다.

||는 좌항이 참이면 우항과 관계없이 결과는 참이므로 우항을 볼 필요가 없습니다.

 

연산의 결괏값을 처리하는 방법

연산을 실행하고 결괏값을 변수에 저장하지 않으면 버려집니다.

따라서 연산 결과를 곧바로 사용하거나 대입 연산자를 통해 저장해야 합니다.

 

확인 문제

1. 4.0과 1.2의 덧셈 뺄셈, 곱셈, 나눗셈을 한 값을 소수점 이하 첫째 자리까지 출력하세요.

#include <stdio.h>

int main(void) {
	double a = 4.0, b = 1.2;

	printf("%.1f + %.1f = %.1f\n", a, b, a + b);
	printf("%.1f - %.1f = %.1f\n", a, b, a - b);
	printf("%.1f * %.1f = %.1f\n", a, b, a * b);
	printf("%.1f / %.1f = %.1f\n", a, b, a / b);

	return 0;
}

 

2. 두 과목의 점수를 입력하여 평균을 출력하는 프로그램을 작성하세요. 평균은 소수점 이하 첫째 자리까지 출력하세요.

#include <stdio.h>

int main(void) {
	int a, b, tot;
	double avg;

	printf("두 과목의 점수 : ");
	scanf("%d %d", &a, &b);
	
	tot = a + b;
	avg = tot / 2.0;

	printf("평균 : %.1lf", avg);

	return 0;
}

 

3. 태희가 신청한 전체 학점과 평점을 게산하여 신청 학점이 10학점 이상이고 평점 평균이 4.0을 넘는 경우 1을 출력하고, 그렇지 않으면 0을 출력하는 프로그램을 작성하세요.

#include <stdio.h>

int main(void) {
	int kor = 3, eng = 5, mat = 4;
	int credits;
	int res;
	double kscore = 3.8, escore = 4.4, mscore = 3.9;
	double grade;

	credits = kor + eng + mat;
	grade = (kscore + escore + mscore) / 3.0;
	res = (10 < credits) && (4.0 < grade);

	printf("%d", res);

	return 0;
}

 

02. 그 외 유용한 연산자

형 변환 연산자

형 변환 연산자는 피연산자의 값을 원하는 데이터형으로 바꿉니다.

(자료형)피연산자

 

자동 형 변환

컴퓨터는 데이터형에 따라 다른 연산 방법을 사용하므로 피연산자가 2개 이상이라면 데이터형이 같아야 합니다.

따라서 컴파일러는 컴파일 과정에서 피연산자의 형태가 다르면 형태를 일치시키는데 이를 자동 형 변환(암시적 형 변환, 묵시적 형 변환)이라고 합니다.

이런 형 변환의 기본 규칙은 크기가 작은 값이 크기가 큰 값으로 바뀌는 것입니다.

 

sizeof 연산자

sizeof 연산자는 피연산자의 크기를 바이트 단위를 계산해서 알려줍니다.

피연산자는 변수, 상수, 수식, 자료형 등이 될 수 있습니다.

sizeof(피연산자)

 

복합대입 연산자

복합대입 연산자는 연산결과를 피연산자에 저장할 필요가 있을 때 사용하면 간단합니다.

산술 복합 대입 연산자에는 +=, -=, *=, /=, %= 다섯 가지가 있습니다.

 

콤마 연산자 

콤마 연산자(,)는 한 번에 여러 개의 숫식을 차례로 나열해야 할 때 사용합니다.

온쪽부터 오른쪽으로 연산을 차례로 수행합니다.

 

조건 연산자

조건 연산자는 유일한 삼항 연산자로 ?와 :기호를 함께 사용합니다.

(조건) ? 피연산자 : 피연산자

조건이 참이면 첫번째 피연산자가 결괏값이 되고 거짓이면 두번째 피연산자가 결괏값이 됩니다.

 

조건 연산자에 대입식 사용하기

조건 연산자의 피연산자에 대입식을 직접 사용해도 됩니다.

(조건) ? 대입식 : 대입식

 

비트 연산자

비트 연산자는 데이터를 비트 단위로 연산합니다.

논리 연산을 수행하는 &, |, ^같은 비트 논리 연산자와 비트들을 좌우로 움직이는 >>, << 같은 비트 이동 연산자가 있습니다.

 

비트별 논리곱 연산자

논리곱 연산자(&)는 두 비트가 모두 1인 경우에만 1로 계산합니다.

 

비트별 배타적 논리합 연산자

배타적 논리합 연산자(^)는 두 비트가 서로 다른 경우에만 1로 계산합니다.

 

비트별 논리합 연산자

논리합 연산자(|)는 두 비트 중에서 하나라도 1이면 1로 계산합니다.

 

비트별 부정 연산자

비트별 부정 연산자(~)는 1일 경우 0으로 바꾸고 0은 1로 바꿉니다.

 

비트 이동 연산자

<<은 비트들을 왼쪽으로 이동하고 >>은 오른쪽으로 이동합니다.

 

연산자 우선 순위

하나의 수식에서 2개 이상의 연산자가 함께 쓰일 떄는 우선 순위의 따라 연산됩니다.

  • 단항 연산자 > 이항 연산자 > 삼항 연산자 순서로 연산됩니다.
  • 산술 연산자 > (비트 이동 연산자) > 관계 연산자 > 논리 연산자 순서로 연산됩니다.

확인 문제

1. short형과 long형의 자료형의 크기를 비교하여 크기가 큰 자료형이 무엇인지 출력하세요.

#include <stdio.h>

int main(void) {
	int res;

	res = (sizeof(short) > sizeof(long));

	printf("%s", (res == 1) ? res : "long");

	return 0;
}

 

2. 야구경기장의 좌석 수가 70개고 입장객 수가 65명일 때 입장률을 출력하세요.

#include <stdio.h>

int main(void) {
	int seats = 70;
	int audience = 65;
	double rate;

	rate = (double)audience / seats * 100;

	printf("입장률 : %.1lf%%", rate);

	return 0;
}

 

3. 3.76시간은 몇 시간, 몇 분, 몇 초인지 출력하세요.

#include <stdio.h>

int main(void) {
    int hour, min, sec;
    double time = 3.76;

    hour = (int) time;
    time -= hour;
    time *= 60.0;
    min = (int) time;
    time -= min;
    time *= 60.0;
    sec = (int) time;
    printf("3.76시간은 %d시간 %d분 %d초입니다.\n", hour, min, sec);

    return 0;
}