JUST GO
[C] 연산자(3) 본문
비트 NOT 연산
- 0은 1로, 1은 0으로 반전한다.

ex - 비트 논리 연산자의 사용
#include <stdio.h>
int main(void)
{
unsigned short x = 0x12;
unsigned short y = 0xF0;
printf("08x & %08x = %08x\n", x, y, x & y); // 비트 AND
printf("%08x | %08x = %08x\n", x, y, x | y); // 비트 OR
printf("%08x ^ %08x = %08x\n", x, y, x ^ y); // 비트 XOR
printf("~%08x = %08x\n", x, ~x); // 비트 NOT
return 0;
}
비트 이동 연산자
- 좌변에 있는 피연산자의 비트들을 우변의 피연산자가 지정하는 만큼 왼쪽으로 또는 오른쪽으로 이동(shift) 한다.
- 비트 왼쪽 이동(<<) 연산자
- 비트들을 왼쪽으로 이동한다.
- 왼쪽으로 밀려난 비트는 사라지고 오른쪽 빈 자리에 0을 채운다.
- n 비트 왼쪽 이동은 2n을 곱하는 것과 같다.
- 비트 오른쪽 이동(>>) 연산자
- 비트들을 오른쪽으로 이동
- 오른쪽으로 밀려난 비트는 사라지고 왼쪽 빈 자리에 부호 비트를 채운다.
- 연산자의 좌변이 부호 없는 정수형이면 왼쪽 빈 자리를 0으로 채운다.
- n 비트 오른쪽 이동은 2n 으로 나누는 것과 같다.
- 비트 왼쪽 이동

- 비트 오른쪽 이동

ex - 비트 이동 연산자의 사용
#include <stdio.h>
int main(void)
{
int x = 0x00000012;
int y = x << 4;
int z = x >> 4;
printf("x = %#08x, %d\n", x, x); // 0x00000012, 18
printf("y = %#08x, %d\n", y, y); // 0x00000120, 288 (18 * 16)
printf("z = %#08x, %d\n", z, z); // 0x00000001, 1 (18 /16)
return 0;
}
조건 연산자
- 피연산자가 3개인 삼항 연산자

ex - 조건 연산자의 사용
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b;
int result, max;
printf("2개의 정수? ");
scanf("%d %d", &a, &b);
printf("%d는 ", a);
a % 2 != 0 ? printf("홀수") : printf("짝수");
printf("입니다.\n");
result = a > 0 ? a : -a;
printf("a의 절대값: %d\n", result);
result = b > 0 ? b : -b;
printf("b의 절대값: %d\n", result);
max = a > b ? a : b;
printf("a, b 중 큰 값: %d\n", max);
return 0;
}
콤마 연산자
- 수식의 값을 왼쪽부터 계산해서 마지막으로 계산한 오른쪽 수식의 값이 연산의 결과가 된다.
- 여러 수식을 한 문장으로 연결할 때 주로 사용된다.

암시적인 형 변환
- 서로 다른 데이터형의 값을 혼합 연산할 때 암시적인 형 변환이 일어난다.

- 정수의 승격
- char형이나 short형의 값이 사용될 때마다 자동으로 int형으로 형 변환된다.
- 정수의 승격도 암시적인 형 변환이다.
- 대입 연산이나 변수의 초기화에서도 암시적인 형 변환이 수행된다.
- 대입 연산자의 좌변과 대입 연산자의 우변의 데이터형이 다르면,
좌변의 데이터형에 맞추도록 형 변환이 일어난다.
- 이 때 값이 손실되면, 컴파일 경고가 발생한다.

ex - 암시적인 형 변환
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
short a, b, c;
printf("정수 2개? ");
scanf("%hd %hd", &a, &b); // short형 변수 입력시 %hd 사용
printf("%d * %d = %d\n", a, b, a * b); // a * b는 int * int로 처리
printf("sizeof(a * b) = %d\n", sizeof(a * b)); // 4
c = a * b; // int형인 (a * b)를 short형으로 변환해서 대입
printf("c = %d\n", c);
printf("sizeof(c) = %d\n", sizeof(c)); // 2
return 0;
}
정수의 승격과 오버플로우

형 변환 연산자
- 명시적인 형 변환

- / 연산의 결과를 실수로 구하려면 명시적인 형 변환이 필요하다.

- 형 변환 연산자를 사용할 때는 형 변환이 언제 수행되는지에 따라 연산의 결과가 달라진다.

세 수의 평균 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a, b, c;
double average;
printf("정수 3개? ");
scanf("%d %d %d", &a, &b, &c);
average = (double)(a + b + c) / 3; // 명시적인 형 변환 필요
// / 연산자의 피연산자 중 하나를 실수형으로 형 변환 한다.
printf("평균: %f\n", average);
return 0;
}
연산자의 우선순위

- '변수 = 수식'의 형태인 경우 항상 수식의 값을 먼저 계산한다.

- 관계 연산자는 논리 연산자보다 우선순위가 높다.

- 산술 연산자는 관계 연산자나 논리 연산자보다 우선순위가 높다.

연산자의 결합 규칙
- 대부분의 연산자는 좌 -> 우 방향으로 결합하고 단항 연산자와 대입 연산자는 우 -> 좌 방향으로 결합한다.

'C > 학습내용' 카테고리의 다른 글
[C] 제어문(switch문) (0) | 2022.10.05 |
---|---|
[C] 제어문(if문) (0) | 2022.10.05 |
[C] 연산자(2) (1) | 2022.10.05 |
[C] 연산자(1) (0) | 2022.10.05 |
[C] C언어와 프로그래밍 개요 (0) | 2022.10.05 |