[C언어] 입출력 함수와 연산자(2)

2025. 10. 3. 12:38·공부/⚙️C

✅ 1. 산술 연산자

(1) 연산자의 개념

(2) 산술 연산자

  • 사칙연산을 포함한 산술 연산을 수행하는 연산자를 의미한다.

  • 피연산자가 1개 일땐 단항 연산자, 2개 이상일 땐 이항 연산자로 구분됨.

[ 이항 연산자 ]

  • 연산자간 덧셈으로 자료형의 범위를 벗어나는 오버플로가 일어나지 않도록 주의해야 함
  • 나눗셈의 제수 즉, x 나누기 0 는 불가능 함.

  • 정수형에만 사용이 가능한 연산자이다.
  • 나머지의 정의는 정수의 소수점 아래를 버리는 방식으로 됨.

[ 이항 연산자 예시 ]

[ 단항 연산자 ]


✅ 2. 관계 연산자와 논리 연산자

(1) 불 값의 표현

(2) 관계 연산자

[ 관계 연산자의 사용 예 ]

  • a 가 4 인 경우 a > 2 에 대한 값으로는 참 값인 1 이 들어가게 된다. 반대로 거짓일 경우 0 이 들어간다.

[ 정리 ]

  • 관계 연산자는 대체로 정수나 이런 값들에 대한 관계를 true 1, false 0 으로 반환하기 위함임.

(3) 논리 연산자

  • and , or , not 논리 연산을 하기 위한 연산자 이며, 비트 연산에서는 & 이런식으로 하나만 쓰임

[ 논리 연산자의 사용 예시 ]

[ 주의 사항 ]

  • 논리 연산 과정에서 참 거짓 확정되면 나머지 부분은 실행하지 않는다.
  • 쉽게말해, 이미지 예시를 보면 and 연산자가 여러개 이고 중간에 b++ <= 5 와 같이 false 가 있는 경우 뒤의 --c > 0 관계 연산은 보지 않고 바로 넘어가게 된다는 것을 의미하는 것이다.
  • 즉, 결과는 b++ <= 5 에서 거짓이 나왔기 때문에 해당 연산은 실행 한 것 으로 알 수 있어 결과적으로 b 는 ++ 증감 된 7 -> 8 이 나올 것이고, --c > 0 은 연산이 수행되지 않았으므로, 9가 아닌 원래 c의 값인 10이 출력이 되는 것이다.
  • 논리식이 참일 경우는 앞에 있어야 좀 더 결과값을 빨리 얻을 수 있다는 의미가 될 수 있음.

[ 정리 ]

  • 논리 연산자는 true, false 와 같은 논리 데이터 간의 논리 연산을 위한 연산자임.
  • 즉, 관계연산자를 통해서 얻은 값 들의 논리연산 등을 수행 할 수 있음.

(4) 조건 연산자

  • expr1 조건식이 참인 경우 expr2 가 실행되고, 거짓인 경우 expr3 이 실행이 된다.

  • 입력값 둘 중 최대값을 구하는 로직으로 볼 수 있으며, 삼항 연산자를 이용해 a >= b 관계 연산에서 참인 경우 a 출력 거짓인 경우에는 b 를 출력하는 로직임.

✅ 3. 대입 연산자

  • 좌측의 값(r-value) 를 우측의 저장공간(l-value) 에 넣는다. 즉, = 를 통해서 대입을 해주는 연산을 의미함.

  • 대입 연산자는 오른쪽 연산을 먼저 한 뒤 대입을 해주게 된다. 즉, c = b = a 는 a -> b -> c 에 결과를 저장하게 됨.
  • float 는 int 로 변환이 되면서, 소수점 아래가 날라가게 됨 즉, c 의 결과는 1.0000.. 이 나오게 됨.

(1) 복합 대입 연산자

  • 쉽게말해, 대입 연산자에 산술 연산자와 같은 일반적인 연산자와 결합된 형태를 복합 대입 연산자라고 한다.

  • 예시를 보면 *= , /= , += 와 같이 대입 연산자와 함께 사용 할 수 있는데 이걸 복합 대입 연산자로 볼 수 있음.

✅ 4. 비트 연산자

(1) 비트 연산자 예시

  • and(&) 연산: x 와 y 각각 비트를 비교하여, and 논리곱을 수행해서 결과를 도출해줌.
  • or(|) 연산: x 와  y 각각 비트를 비교하여, or 논리합을 수행해서 결과를 도출해줌.
  • XOR(^) 연산: x 와 y 각각 비트를 비교하여, XOR 논리연산을 수행해서 결과 도출
  • NOT(~) 연산: x 의 1인 비트는 모두 0으로 0인 비트는 모두 1로 변경을 해줌.
  • 시프트(<<) 연산 : 맨 좌측의 2개의 비트는 사라지고 오른쪽의 비트 2개가 0으로 채워지는 비트 연산이다.
  • 시프트(>>) 연산 : 반대로 맨 우측의 2개의 비트는 사라지고 왼쪽의 비트 2개가 0으로 채워지는 비트 연산이다.

(2) 비트 연산자의 활용

int x = 0b10101100; // 172
int mask = 0b00001111; // 하위 4비트만 남기는 마스크
int result = x & mask;
// and 연산을 통해 비트 비교
  • 비트 마스크: 특정 비트만 추출하거나, 변경하거나, 검사하기 위해 비트 연산자를 함께 사용하는 패턴을 의미함.

  • 특정 비트만 0으로 지우기와 같이 비트연산자는 유용하게 쓰일 수 있음.
  • 위와 같이 mask 를 활용하면, 특정 부분에 0을 넣게 되면 논리곱(and) 을 통해 반드시 0이 되게 만들 수 있음.
  • 원래값은 유지하되 특정 값만 0으로 변경하고 싶을 때 사용 할 수 있음. 비트 연산자로는 이러한 형태의 연산을 할 수 있음.

  • 또한, 논리합을 통해 특정 비트를 1로 채우는 것도 가능함.

  • 반전을 하고싶은 비트 부분에는 1을 채워넣게 되면 XOR 연산을 통해 반전시킬 수 있음.

[ 시프트 연산 ]

  • 2^n 곱하기 만큼 왼쪽으로 비트를 이동 할 수 있음.
  • x << 3 인 경우 2^3 만큼 비트를 이동하는 것임. 이유는, 이진수는 자리 수에 맞게 지수가 늘어나기 때문임.
  • 시프트(<<) 연산 : 맨 좌측의 2개의 비트는 사라지고 오른쪽의 비트 2개가 0으로 채워지는 비트 연산이다.

 

  • 위와 동일하게 2^n 곱하기 만큼 오른쪽으로 비트를 이동 할 수 있음.
  • 시프트(>>) 연산 : 반대로 맨 우측의 2개의 비트는 사라지고 왼쪽의 비트 2개가 0으로 채워지는 비트 연산이다.

✅ 5. 기타 연산자

  • sizeof(): 해당 식이 차지하는 기억공간의 크기인 byte 크기를 구해서 반환을 해준다.
  • 형변환 연산자: 식의 자료형을 다른 자료형으로 강제로 형을 바꿈
  • , : 컴마 기호는 두 개의 식을 하나로 묶어주는 것
  • & : 피연산자의 주소를 구해주는 연산자
  • * : 포인터가 가리키는 곳 또는 그곳의 내용을 가리키는 연산자임.

(1) sizeof() 연산자

int main() {
    int a = 10;
    double b = 3.14;
    printf("a의 크기: %zu bytes\n", sizeof(a));
    printf("b의 크기: %zu bytes\n", sizeof(b));
    return 0;
}
// 출력 결과
// a의 크기: 4 bytes
// b의 크기: 8 bytes
  • C에서 sizeof는 **함수가 아니라 연산자(operator)**이다.
  • 겉보기에는 sizeof(변수명)처럼 괄호를 사용해서 함수처럼 보이지만, 컴파일 시점에 타입의 크기를 계산하는 연산자임.
  • 즉, 실행 중(런타임)에 동작하는 함수가 아니라, 컴파일 동안에 컴파일러가 미리 계산을 해줌.

(2) 콤마 연산자

  • 두 개 이상의 식(expression)을 순서대로 실행하고, 마지막 식의 결과값을 반환하는 연산자이다.
#include <stdio.h>

int main() {
    int a = 1, b = 2, result;

    result = (a += 2, b += 3); // a는 먼저 3이 되고, b는 5가 됨
    printf("a = %d, b = %d, result = %d\n", a, b, result);
    return 0;
}
// 출력: a = 3, b = 5, result = 5
  • a 초기값 1, b 초기값 2 상태에서 a += 2, b += 3 을 콤마로 묶어서 result 변수 초기화하는 과정이다.
  • 이 과정에서 콤마로 묶인 부분에는 a = 1 + 2 = 3 , b = 2 + 3 = 5 -> a = 3 , b = 5 가 될 것이다.
  • 콤마 연산식의 값은 마지막 식의 값이기 때문에 result 변수에 담기는 값은 b 의 5가 담길 것이다.
  • 즉, 결과는 a, b, result 변수를 찍으면 각 3, 5, 5 가 될 것이다.

[ 콤마 연산자 사용 이유 ]

  • 한 줄 안에서 여러 표현식을 순서대로 실행해야 할 때 굉장이 유용하게 쓰임
  • 즉, 한 문장 안에 여러 계산을 넣되, 마지막 결과만 사용하고 싶을 때 사용하는 도구로 보면 됨.
  • 대표적으로는 for문(반복문) 에서 사용을 할 수 있음.
#include <stdio.h>
int main() {
    int i, j;
    for (i = 0, j = 4; i < 5; i++, j--) {
        printf("[%d, %d]\n", i, j);
    }
}
// result:
// [0, 4]
// [1, 3]
// [2, 2]
// [3, 1]
// [4, 0]
  • for 문의 구성은 for(초기식; 조건식; 증감식) 형태로 구성이 되어 있음.
  • 콤마 연산자를 활용하게 되면 초기식 부분에 변수를 초기화 할 때 i, j 둘 다 같이 초기화를 시켜줄 수 있음.
  • 또한, 마지막 매 반복 끝날 때마다 실행되는 증가식을 통해 루프 변수 값을 변경 할 수 있는데, 이 때 콤마 연산자를 활용하면 초기식에서 초기화한 변수 두 개를 증가 시키거나 감소시킬 수 있게 됨. 
  • 이렇게 반복문에서 콤마 연산자를 사용하게 되면 한 줄에서 여러 변수를 동시에 제어할 수 있게 됨.
  • 즉, 별도의 중첩 루프나 추가 문장 없이 한 줄로 표현 가능하고 가독성이 어느 정도 유지되는 한에서 코드 줄 수 감소가 됨.

(3) 형변환

[ 형변환(type cast) 이란? ]

  • 식의 자료형을 다른 자료형으로 바꾸는 것을 의미함.
  • 형변환 연산자: 명시적으로 형변환을 지시하는 연산자이며, 위의 형식처럼 () 괄호를 통해 타입을 넣어주는 것을 의미함.

  • 위와 같이 3 / 4 를 나누게 되면, 0.7... 이 되는데 정수형 이기 때문에 소수점 아래를 없애버림 즉, 0이 나옴
  • 그리고 double c 로 받게 되면 이미 소수점 아래를 잃어버린 상태로 들어왔기 때문에 출력 결과는 0.000000 이 나오게 됨.
  • 이것을 이제 소수점을 얻은 상태로 나눗셈을 하고 싶을때에는?

  • 이와 같이 a 를 명시적으로 형변환을 double 로 해주게 되면 실수간의 연산으로 보고 소수점을 버리지 않는다.
  • 또한, b는 정수지만 c에서 다른 자료형간의 연산은 더 큰 바이트 단위를 가지는 자료형으로 자동으로 형을 변환을 해주게 된다.
  • 즉, b 의 int 4byte 는 double 8byte 의 double 자료형으로 자동으로 형변환이 되게 되면서 연산이 수행이 된다.
  • 이와 같이 자동으로 형변환이 되는 것을 묵시적 형변환 이라고 한다.

  • 묵시적 형변환의 핵심은 다른 자료형 간의 연산에서 표현 범위가 더 큰 자료형으로 자동으로 변한다는 것이 핵심임.
  • 또한, int형보다 작은 자료형은 효율적인 처리를 위해 int 또는 unsigned int형으로 변환이 됨.

[ 묵시적 형변환 예시 ]

  • 곱셈 연산이 먼저 일어나 int 정수형 값보다 더 큰 범위로 표현이 가능한 float 형으로 변환이 되게 됨.
  • 이후, double 과의 연산을 통해 double로 변환이 됨.
  • 최종적으로 int 자료형을 가지는 결과에 대입을 해줄때에는 값을 받는 곳에 맞춰서 double 형이 int 로 변해서 저장이 되게 됨.
  • 이렇듯 연산자의 우선순위에 따라 자료형의 변환이 달라질 수 있음.

(4) 연산자의 우선순위와 결합방향

'공부 > ⚙️C' 카테고리의 다른 글

[C언어] 함수와 기억 클래스(1)  (0) 2025.10.15
[C언어] 선택 제어문과 반복 제어문  (0) 2025.10.13
[C언어] 입출력 함수와 연산자(1)  (0) 2025.09.05
[C언어] 자료형과 선행처리기  (1) 2025.08.29
[C언어] C 언어의 개요  (1) 2025.08.18
'공부/⚙️C' 카테고리의 다른 글
  • [C언어] 함수와 기억 클래스(1)
  • [C언어] 선택 제어문과 반복 제어문
  • [C언어] 입출력 함수와 연산자(1)
  • [C언어] 자료형과 선행처리기
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (233)
      • 방송통신대학교 (87)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    함수
    배열
    C언어
    Java
    방통대
    운영체제
    컴퓨터의 이해
    컴퓨터과학 개론
    그래프
    자료구조
    파이썬
    방송통신대학교
    spring
    유비쿼터스
    이산수학
    알고리즘
    컴퓨터과학과
    방송대
    자바
    Python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[C언어] 입출력 함수와 연산자(2)
상단으로

티스토리툴바