Programming 기초/C Language

C 언어 기초 #4 여러가지 연산자(증감, 복합대입, 형변환, 관계, 논리, 조건, 콤마, 비트단위)

코딩상륙작전 2023. 4. 7. 22:05

*증감연산자

++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