알고리즘

[알고리즘] 배열 요소 정렬 / 함수형식 매크로

FORHAPPy 2021. 9. 29. 14:40

배열요소 정렬

 

정수/정수 연산은 나머지를 버리고 정수부만 얻을 수 있다.

나머지 버리기에 매우 좋다.

 

배열요소의 앞뒤를 바꾸기와 순차적으로 정렬할 경우 

같은 자료형의 새로운 변수를 사용하여 재배열 해준다.

 

  1. 가장 왼쪽 요소의 인덱스는 i
  2. 가장 오른쪽 요소의 인덱스는 n -1 -i
  3.  위그림 처럼 두값을 교환하는 과정을 함수형식 매크로로 구현하면 프로그램이 짧아지고 읽기도 쉬워진다.

 

<함수형식 매크로>

#define swap(type, x ,y) do{type t = x; x =y; y = t;} while(0)
#define SQR(X) ((X)*(X)) 

매크로 함수의 장단점

매크로 함수의 장점은 다음과 같습니다.

 

1. 매크로 함수는 단순 치환만을 해주므로, 인수의 타입을 신경 쓰지 않습니다.

2. 매크로 함수를 사용하면 여러 개의 명령문을 동시에 포함할 수 있습니다.

3. 함수 호출에 의한 성능 저하가 일어나지 않으므로, 프로그램의 실행속도가 향상됩니다.

 

매크로 함수의 단점은 다음과 같습니다.

 

1. 원하는 결과를 얻는 정확한 매크로 함수의 구현은 어려우며, 따라서 디버깅 또한 매우 어렵습니다.

2. 매크로 함수의 크기가 증가하면 증가할수록 사용되는 괄호 또한 매우 많아져서 가독성이 떨어집니다.

 

따라서 매크로 함수는 크기가 큰 함수보다는 간단한 함수를 대체하는 데 사용하는 것이 좋습니다.

 

 

 

매크로 함수내용

[참고] http://tcpschool.com/c/c_prepro_macroFunc

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

매크로로 변환한 swap

 

 

 

위의 매크로함수에 대해 좀더 설명해 보자면 위의 그림처럼 작성한 코드가 매크로함수로 바뀌게 되면

 

#define swap(type, x ,y) do{type t = x; x =y; y = t;} while(0)

형태로 변환된다. 

매크로안에서 변수를 선언할 수 있도록 (type t) do while을 사용하여 서로 값을 맞바꾼다.

type 부분에 자료형을 넣어 줌으로써 지정한 자료형으로 변수를 선언 할 수 있다.

 

do while (0)은 중괄호로 묶여 있기 떄문에 안에서 변수를 선언 할 수 있다.

선언된 변수는 do while (0)을 벗어나면 변수는 사라지게 되므로 중괄호는 필수 적으로 사용되어야 한다.

 

매크로에서 do while (0)을 사용하면 if 조건문과 for, while 반복문에서도 문제 없이 사용할 수 있습니다.

이 코드가 전처리기를 거치면 다음과 같이 } (닫는 중괄호) 뒤에 ; (세미콜론)이 붙어서 컴파일 에러가 발생합니다.

 

#define을 거치면 전처리기에서 세미콜론을 자동으로 붙여주는데 

do while의 경우 do{type t = x; x =y; y = t;} while(0) 이런형태를 넣어주면 세미콜론이 붙게 된다.

원래 함수의 형태가 do{type t = x; x =y; y = t;} while(0); 이므로 오류 없이 잘 작동하게 되는 것이다.