Post

Chapter 2. 수식과 연산자

Chapter 2. 수식과 연산자

‘쉽게 풀어쓴 C언어 Express - 천인국’ 5장 학습 내용

소스코드

1절. 수식(expression)

수식이란?

  • 상수, 변수, 연산자의 조합이다.
  • 연산자와 피연산자로 나누어진다.

2절. 연산자

기능에 따른 연산자 분류

연산자의 분류연산자의미
대입=오른쪽을 왼쪽에 대입
산술+ - * / %사칙연산과 나머지 연산
부호+ -상수 및 변수 앞의 부호
증감++ –증가, 감소 연산
관계< > == != >= <=오른쪽과 왼쪽을 비교
논리&& ll !논리적인 AND, OR, NOT
조건?조건에 따라 선택
콤마,피연산자들을 순차적으로 실행
비트 단위 연산자& l ^ ~ » «비트별 AND, OR, XOR, 반전, 이동
sizeof 연산자sizeof자료형이나 변수의 크기를 바이트 단위로 반환
형변환(type)변수나 상수의 자료형을 변환
포인터 연산자* & []주소 계산, 포인터가 가리키는 곳의 내용 추출
구조체 연산자. ->구조체의 멤버 참조

피연산자 수에 따른 연산자 분류

  • 단항 연산자 : 피연산자의 수가 1개
    • ++x;
    • –y;
  • 이항 연산자 : 피연산자의 수가 2개
    • x + y;
    • x - y;
  • 삼항 연산자 : 연산자의 수가 3개
    • x ? y : z;
  • (참고) 거듭 제곱 연산자는?
    • C언어에는 거듭 제곱을 나타내는 연산자가 없다.
      • x * x와 같이 단순히 변수를 두 번 곱한다.

나머지 연산자

  • 나머지 연산자(modulus operator)는 첫 번째 피연산자를 두 번째 피연산자로 나누었을 경우의 나머지를 계산한다.
    • 10 % 2는 0이다.
    • 5 % 7은 2이다.
    • 30 % 9는 3이다.
  • 나머지 연산자를 이용한 짝수와 홀수 구분
    • x % 2가 0이면 짝수
  • 나머지 연산자를 이용한 5의 배수 판단
    • x % 5가 0이면 5의 배수
// 나머지 연산자 프로그램
#include <stdio.h>
#define SEC_PER_MINUTE 60     // 1 minute = 60 seconds

int main(void)
{
      int input, minute, second;    
      
      printf("input seconds : ");  
      scanf("%d", &input);
      
      minute = input / SEC_PER_MINUTE;    
      second = input % SEC_PER_MINUTE;   
      
      printf("%d seconds is %d minutes %d seconds.\n", input, minute, second);
      return 0;
}

부호 연산자

  • 변수나 상수의 부호를 변경
#include <stdio.h>

int main(void)
{
      int x, y;        
      x = -10;          
      y = -x;          
      
      printf("print y : %d", y);      
}

증감 연산자

  • 증감 연산자 : ++, –
  • 변수 하나의 값을 증가시키거나 감소시키는 연산자이다.

  • (참고) ++x와 x++의 차이 ++xandxx++

증감 연산자 정리

증감 연산자의미
++x수식의 값은 증가된 x 값이다.
x++수식의 값은 증가되지 않은 원래의 x 값이다.
–x수식의 값은 감소된 x 값이다.
x–수식의 값은 감소되지 않은 원래의 x 값이다.

복합 대입 연산자

  • 복합 대입 연산자란 += 처럼 대입 연산자 =와 산술 연산자를 합쳐 놓은 연산자
  • 소스를 간결하게 만들 수 있다.
    • ex) x += y 는 x = x + y와 같은 의미이다.
복합 대입 연산자의미
x += yx = x + y
x -= yx = x - y
x *= yx = x * y
x /= yx = x / y
x %= yx = x % y
x &= yx = x & y
x l= yx = x l y
x ^= yx = x ^ y
x »= yx = x » y
x «= yx = x « y

오류 주의

  • 다음과 같은 수식은 오류이다
    • ++x = 10;
      • 등호의 왼쪽은 항상 변수여야 한다.
    • x + 1 = 20;
      • 등호의 왼쪽은 변수만 존재해야 한다.
    • x =* y;
      • =*이 아니라 *=를 사용해야 한다.

관계 연산자

  • 두 개의 피연산자를 비교하는 연산자
  • 결과값은 참(1) = true 아니면 거짓(0) = false
연산자의미
x == yx와 y가 같은가?
x != yx와 y가 다른가?
x > yx가 y보다 큰가?
x < yx가 y보다 작은가?
x >= yx가 y보다 크거나 같은가?
x <= yx가 y보다 작거나 같은가?
#include <stdio.h>

int main(void)
{
      int x, y;   
      
      1 == 1;           // true(1)
      1 != 2;           // true(1)
      2 > 1;            // true(1)
      x >= y;           // if x > y = true(1), or false(0)
}

관계연산자 사용 주의

  • (x = y)
    • y의 값을 x에 대입한다. 이 수식의 값은 x의 값이다.
  • (x == y)
    • x와 y가 같으면 1, 다르면 0이 수식의 값이 된다.
    • (x == y)를 (x = y)로 잘못 쓰지 않도록 주의하자.
  • 수학에서처럼 2 < x < 5와 같이 작성하면 잘못된 결과가 나온다.
    • ex) 올바른 방법 : (2 < x) && (x < 5)

실수를 비교하는 경우

  • (1e32 + 0.01) > 1e32
    • 양쪽의 값이 같은 것으로 간주되어서 거짓
  • (fabs(x-y)) < 0.0001
    • 올바른 수식

논리 연산자

  • 여러 개의 조건을 조합하여 참과 거짓을 따지는 연산자
  • 결과값은 참(1) 아니면 거짓(0)
연산자의미
x && yAND 연산, x와 y가 모두 참이면 참, 그렇지 않으면 거짓
x || yOR 연산, x나 y 중에서 하나라도 참이면 참, 모두 거짓이면 거짓
!xNOT 연산, x가 참이면 거짓, x가 거짓이면 참

AND 연산자 예시

  • 어떤 회사에서 신입 사원을 채용하는데 나이가 30살 이하이고 토익 성적이 700점 이상이라는 조건을 걸었다고 가정하자.

AND

OR 연산자 예시

  • 신입 사원을 채용하는 조건이 변경되어서 나이가 30살 이하이거나 토익 성적이 700점 이상이면 된다고 하자.

OR

NOT 연산자

  • 피연산자의 값이 참이면 연산의 결과값을 거짓으로 만들고, 피연산자의 값이 거짓이면 연산의 결과값을 참으로 만든다.

NOT

  • result = !1; // result에는 0이 대입된다.
  • result = !(2 == 3); // result에는 1이 대입된다.

참과 거짓의 표현 방법

  • 관계 수식이나 논리 수식이 만약 참이면 1이 생성되고 거짓이면 0이 생성된다.
  • 피연산자의 참, 거짓을 가릴 때에는 0이 아니면 참이고 0이면 거짓으로 판단한다.
  • 음수
    • C에서는 0이 아니면 참으로 간주
    • 음수도 참으로 간주
  • NOT 연산자를 적용하는 경우
    • !0;
      • 식의 값 = 1
    • !3;
      • 식의 값 = 0
    • !-3;
      • 식의 값 = 0

논리 연산자의 예

  • “x는 1, 2, 3 중의 하나인가?”
    • (x == 1) (x == 2) (x == 3)
  • “x가 60 이상 100 미만이다.”
    • (x >= 60) && (x < 100)
  • “x가 0도 아니고 1도 아니다.”
    • (x != 0) && (x != 1)
      • x는 0도 아니고 1도 아니다.

조건 연산자

  • 3개의 피연산자를 가지는 삼항 연산자

iff

absolute_value = (x > 0) ? x: -x;    // 절댓값 계산
max_value = (x > y) ? x: y;          // 최댓값 계산
min_value = (x < y) ? x: y;          // 최솟값 계산
(age > 20) ? printf("성인\n"): printf("청소년\n");   // 20살 이상이라면 성인을 출력, 20살 미만이라면 청소년을 출력

3절. 비트 연산자

비트 연산자

  • 논리 연산자와 비트 연산자는 다르다.
연산자연산자의 의미예
&비트 AND두 개의 피연산자의 해당 비트가 모두 1이면 1, 아니면 0
|비트 OR두 개의 피연산자의 해당 비트 중 하나라도 1이면 1, 아니면 0
^비트 XOR두 개의 피연산자의 해당 비트의 값이 같으면 0, 아니면 1
«왼쪽으로 이동지정된 개수만큼 모든 비트를 왼쪽으로 이동한다.
»오른쪽으로 이동지정된 개수만큼 모든 비트를 오른쪽으로 이동한다.
~비트 NOT0은 1로 만들고 1은 0으로 만든다.

비트 AND 연산자

Andd

비트 OR 연산자

Orr

비트 XOR 연산자

XOR

비트 NOT 연산자

Nott

비트 이동 연산자

  • 크기를 비교하는 관계 연산자와 다르다
연산자기호설명
왼쪽 비트 이동«x « y x의 비트들을 y 칸만큼 왼쪽으로 이동
오른쪽 비트 이동»x » y x의 비트들을 y 칸만큼 오른쪽으로 이동

« 연산자

  • 비트를 왼쪽으로 이동
  • 값은 2배가 된다.

left

» 연산자

  • 비트를 오른쪽으로 이동
  • 값은 1/2배가 된다.

right

10진수를 2진수로 출력하기

  • 아래의 예제는 10진수를 2진수로 변환하여 출력하는 예제이다.
  • 변수 mask에 1의 값을 저장하고, 왼쪽으로 7비트를 이동시키면 mask = 00000001 에서 mask = 10000000 이 된다.
  • 입력하는 10진수를 2진수로 고치면 8비트의 2진수 형태가 되는데, 2진수는 오른쪽부터 2의 0승, 2의 1승, ···, 2의 7승의 비트를 가진다.
  • 아래의 과정은 왼쪽으로 7비트 이동시켰던 값을 오른쪽으로 1비트씩 이동시키면서 예시로 입력한 num10에 저장된 수와 0의 위치가 같으면 0을 출력, 만약에 0이 아니라 1이 있으면 1을 출력한다.
  • &는 and의 의미를 담고 있는 기호이며, (num10 % mask) == 0이 맞다면 왼쪽의 printf(“0”)을, 아니라면 printf(“1”)을 출력하면 된다.

코드 바로가기

정수 연산 시의 자동적인 형변환

  • 정수 연산 시 char 형이나 short 형의 경우, 자동적으로 int 형으로 변환하여 계산한다.

TypeChange

This post is licensed under CC BY 4.0 by the author.