C 언어 기초 #4 여러가지 연산자(증감, 복합대입, 형변환, 관계, 논리, 조건, 콤마, 비트단위)
*증감연산자
++x -> 먼저 증가시켜 증가된 x의 값을 수식에 사용.
x++ -> 수식에 현재 x 값 대입 후 나중에 x를 증가시킴.
*복합대입연산자

*대입 연산시 자동적인 형변환
double f;
f = 10;
10이 double형으로 변환된 후에 변수 f로 대입된다. 이러한 변환을 올림 변환(promotion)이라고 한다.
int i;
i = 3.141592;
3.141592가 정수형 변수에 대입되면 3으로 변환되어 저장된다. 이러한 변환을 내림 변환(demotion)라고 한다.
-> 데이터의 손실을 야기함. (int형을 char형에 대입하면 내림 변환 발생. int형은 4바이트고 char형은 1바이트)
*수식 연산시 자동적인 형변환
char형과 short형은 수식 계산시 cpu 연산 처리의 편의상 int 형으로 자동 승격되어 계산됨. 그래서 그 수식의 결과값은 int 형이 됨.또한 하나의 수식에서 서로 다른 자료형이 사용되면 모든 자료형은 그중에서 가장 높은 등급의 자료형으로 자동적으로 변환된다. -> 데이터 손실을 막기 위해.
높은 등급 순 : int < unsigned int < long < unsigned long < float < double < long double
*명시적인 형변환
형변환(type cast)연산자. 캐스트 연산자. (int) 1.23456 // int형으로 변환 괄호를 이용하여 변환한다.
f= (double)i; // 변수 I의 값이 double형으로 변환된다.
변수 자체가 변화하는 것이 아니라 단지 변수의 값만 잠시 그 형을 바꾸어서 수식에서 사용하는 것뿐이다.
*관계연산자
그 결과는 참(ture) 아니면 거짓(false)으로 계산된다.
| 연산 | 의미 |
| X == Y | X와 Y가 같은가? |
| X != Y | X와 Y가 다른가? |
| X > Y | X가 Y보다 큰가? |
| X < Y | X가 Y보다 작은가? |
| X >= Y | X가 Y보다 크거나 같은가? |
| X <= Y | X가 Y보다 작거나 같은가? |
*논리연산자
| 연산 | 의미 |
| x && y | AND 연산, x와 y가 모두 참이면, 참, 그렇지 않으면 거짓 |
| x || y | OR 연산, x나 y 중에서 하나만 참이면 참, 모두 거짓이면 거짓 |
| !x | NOT 연산, x가 참이면 거짓, x가 거짓이면 참 |
-> 단축계산 x&&y에서 x 값이 거짓이면 y값은 계산조차 안함.
// 윤년 판정 프로그램
#define _CRT_SECURE_NO_WARNINGS // 비주얼스튜디오 scanf 오류없애기 위해 정의. 가장 먼저 정의해야됨.
#include<stdio.h>
int main(void)
{
int year, result;
printf("연도를 입력하시오:");
scanf("%d", &year);
// 윤년 조건 1. 연도가 4로 떨어진다.
// 윤년 조건 2. 100으로 나누어 떨어지는 연도는 제외한다.
// 윤년 조건 3. 400으로 나누어 떨어지는 연도는 윤년이다.
result = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
if (result == 0) printf("\n%d연도는 윤년이 아닙니다.\n", year);
else printf("\n %d연도는 윤년이 맞습니다.\n", year);
// result 값을 출력함
printf("result=%d", result);
return 0;
}
*조건연산자
유일하게 3개의 피연산자를 가지는 삼항 연산자.
z = (x > y) ? x : y; -> 참이면 x 거짓이면 y값.
*콤마연산자
x = (2+3, 5-3); -> 2+3이 먼저 계산된 다음 5-3이 계산된다. 수식의 결과값은 5-3의 결과값이 되고 결국 2가 됨.
*비트단위연산자(p.181 – 184)
->정수타입 피연산자에만 적용할 수 있다. (char, short, int, long 등)
A =0100 1100 B = 1100 1010
| 연산자 | 연산자의 의미 | 설명 |
| & | 비트 AND | A&B -> 0100 1000 |
| | | 비트단위 OR | A|B -> 1101 1110 |
| ^ | 비트단위 XOR | A^B -> 1001 0110 |
| ~ | 비트단위 NOT | ~A -> 1010 0011 |
| << | 왼쪽으로 1비트 이동 | A<<3 -> 1110 0000 |
| >> | 오른쪽으로 1비트 이동 | A>>3 -> 0000 1011 |
*예제 : 컬러 픽셀 추출기
일반적으로 트루 컬러 영상에서 하나의 픽셀이 가지고 있는 색상은 32비트로 표현됨. 32비트는 다시 4개의 8비트로 나누어진다. 최상위 8비트는 픽셀의 투명도를 나타내고 나머지 3개의 8비트는 빛의 3원색인 R, G, B 성분이 얼마나 들어 있는지를 나타낸다.
AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB
0000 0000 1111 1111 0000 0000 0000 0000
//컬러 픽셀 추출기
#include<stdio.h>
int main(void)
{
unsigned int color = 0x00380000; //픽셀의 색상
unsigned int result;
/*
printf("%x\n", color); // 출력값 : 380000
printf("%#x\n", color); // 출력 값 : 0x380000 #은 몇 진법인지 표시해주는 기능.
*/
printf( "픽셀의 색상: %#08x\n", color );
result = color & 0x00ff0000; // 마스크 연산, 중가에 위치한 비트 추출
result = result >> 16; // 비트 이동 연산. 오른쪽 16비트 이동
printf("추출된 빨강색: %#08x\n", result);
return 0;
}
*연산자 우선순위
콤마 < 대입 < 논리 < 관계 <산술 < 단항 모를 땐 그냥 괄호 쓰자.
출처 : 쉽게 풀어쓴 C언어 Express