컴퓨터 언어/C

[C] C언어 8일차 기타 문법1 (enum, goto, label, union, 전처리기 지시문)

훈츠 2020. 3. 17. 17:39
반응형

안녕하세요. 훈츠 입니다. 드디어 앞으로 한번만 더 정리하면 C언어 문법을 마무리 하게 되었습니다. 사전 지식이 있어서 그런지 생각보다 빠르고 쉽게 정리 할수있었네요. ㅎㅎ 기타 문법에 대해 정리해 보도록 하겠습니다. 

enum 열거형

  • 역활 : 문자열이 정수형 상수를 대신 하도록 한다. 
  • 형식 
    • enum 태그 { 문자열1, 문자열2, ...}; : 초기값이 없으면 0부터 1씩 증가한 값으로 설정 됩니다. 
    • enum 태그 { 문자열1 = 초기값, 문자열2, ...}; : 초기값이 있으면 설정값 부터 1씩 증가한 값으로 설정 됩니다. 
    • ex) enum COUNT { ZERO, ONE, TWO };
    • enum COUNT Count;
    • printf("%d ", Count = TWO };
#include <stdio.h>
#include <conio.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
typedef struct _POINT {
	int x;
	int y;
}PT;

typedef enum _COUNT {
	ZERO, ONE, TWO
}COUNT;

int main() {
	COUNT count; //Enum 형선언
	count = ONE;
	printf("%d \n",count);
	
	PT p; 
	p.x = TWO; //구조체PT 에 Enum 값 쓰기 
	printf("%d \n", p.x);

	_getch();
	return 0;
}

GOTO & Lable 

  • 역활 : 제어를 레이블이 있는 위치로 이동시켜 실행 하게 합니다. 
  • 레이블 lable : 제어를 옮길 위치를 나타냅니다. 
  • goto 문 주의 사항 및 사용 예
    • 많은 goto문은 제어를 복잡하게 합니다. 
    • 사용예 : 중첩된 for 문을 빠져 나갈때 goto 문 사용. break는 for 문 한단계 만 빠져나가집니다. 
  • 형식 
    • goto 레이블명;
    • 레이블명 : 실행문;
    • goto STOP;
    • STOP : printf("STOP 라인 입니다. ");

활용 예시

int main() {

	int i, j;
	for(i = 0; i < 3; i++) {
		for (j = 0; j < 3; j++) {
			if (i == 1) {
				goto STOP;
			}
			printf("i:%d, j:%d \n", i, j);
		}
	}
	STOP: {
		printf("종료되었습니다.  \n");
	}

	_getch();
	return 0;
}

union 공용체 

네트워크 프로그램 할때, 혹은 메모리가 작은 아두이노, 라지베리파이 데이터를 사용할때 유니온을 사용합니다. 

  • 역활 : 기억 장소를 서로 다른 데이터형이 공유, 사용은 구조체와 동일 합니다. 
  • 형식: 태그는 대문자로 사용
    • union 태그 {
      • int nVar;
      • char cVar[4];
    • };
//union 
union DATA {
	struct _IP {
		int a1, a2, a3, a4;
	} IpPart;
	int nIp[4];
};

int main() {

	union DATA Data;
	printf("ip를 입력하세요 : \n");
	int i;
	for (i = 0; i < 4; i++) {
		printf("i %d : ", i);
		scanf_s("%d", &Data.nIp[i]); //입력은 Data.nIp[n] 에 받았지만
	}
	//출력은 Data.IpPart.a 에 출력합니다. 
	printf("%d.%d.%d.%d ", Data.IpPart.a1, Data.IpPart.a2, Data.IpPart.a3, Data.IpPart.a4);
	_getch();
	return 0;
}

출력 화면

전처리기 지시문 

  • 역활 
    • 컴파일 전에 파일 내용이나 소스 내용을 삽입, 수정하기 위한 역활을 합니다. 
  • 지시문 
    • 빈도수 높은 : #define, #if , #ifndef, #endif , #include
    • 빈도수 낮은 : #error, #elif, #else, #line, #undef
  • #define 
    • 역활 : 매크로 상수와 함수를 생성하는 역활
      • 매크로 상수 형식 : 문자열이 상수를 대신하는 형식
      • 매크로 함수 형식 : 간소화 된 함수 형식

매크로 상수 예제 

#include <stdio.h>
#define PI 3.14
#define MAX 20

int main() {
	char strName[MAX] = "C language";
	printf("%.2f \n%s \n", PI, strName);
	_getch();
	return 0;
}

매크로 함수 예제

#define Multi(x,y) (x*y)
#define PRINT_D(x) printf("%d \n",x)
#define PRINT_S(x) printf("%s \n",x)
#define MAX(X,Y) (X >Y ? X : Y)
#define MIN(X,Y) (X <Y ? X : Y)

int main() {
	PRINT_D(Multi(3, 5));
	PRINT_D(MAX(5, 10));
	PRINT_D(MIN(5, 10));
	//if 문의 간결식
	int x, y, result;
	x = 10;
	y = 5;
	result = x > y ? x : y;
	PRINT_S("IF문 간결식 결과");
	PRINT_D(result);

	_getch();
	return 0;
}

#if, #ifdef, ifndef, #endif

  • #if 는 if문 기능이 같습니다. 
  • #ifdef 는 어떤 변수가 #define 되어있는지 알아보는 기능입니다. 
  • #ifndef 는 #ifdef와 반대로 정의되어 있지 않으면 발생하는 전처리기 입니다. 
#define VALUE 10

int main() {
//#if 예시
#if VALUE == 10
	printf("VALUE 값은 10이 맞습니다. \n");
#elif VALUE ==20
	printf("VALUE 값은 20이 맞습니다. \n");
#endif // A == 10

//#ifdef 예시
#ifdef VALUE
	printf("VALUE 값이 정의되어 있습니다. \n");
#else
	printf("VALUE 값이 정의되어 있지 않습니다. \n");
#endif

//#ifndef 예시
#ifndef PI
#define PI 3.14

#endif // !PI
	printf("%f ", PI);

	_getch();
	return 0;
}


해당하지 않는 경우는 연해진것을 볼수 있습니다. 

 

반응형