정렬

2014-01-22 1 views
0

우리가 매크로 SWAP 정의 말할 수 있습니다 매크로에게 [C]를 사용하여 3 개 번호 :정렬

:

#define SWAP(a,b) {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;}\ 

우리는 3 개 개의 숫자를 정렬 할 필요가 SWAP을 사용하여 (다만 매크로라는 SWAP를 사용하는 다른 매크로를 쓰기)

#define SORT(a,b,c) \ 
    (a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

나는 다음과 같이 쓴하지만 내 코드는 몇 가지 오류 보여줍니다 : 내가 얻을

#include <stdio.h> 

#define SWAP(a,b) {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;}\ 

#define SORT(a,b,c) \ 
    (a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

int main() 
{ 
    int a = 1024, b = 7, c = 11; 

    printf("a = %d b = %d\n", a, b); 
    SWAP(a,b) 
    printf("a = %d b = %d\n", a, b); 

    printf("a = %d b = %d c = %d\n", a, b); 
    SORT(a,b,c) 
    printf("a = %d b = %d c = %d\n", a, b); 

    return 0; 
} 

오류 :

(a > b) ? { 
int tmp = a; 
a = b; 
b = tmp; 
} : ((a > c) ? { 
int tmp = a; 
a = c; 
c = tmp; 
} : ((b>c) : { 
int tmp = b; 
b = c; 
c = tmp; 
})) 

이 아닌 유효한 C 코드 : 각 SWAP (A, B)를 확장

(a > b) ? SWAP(a,b) : ((a > c) ? SWAP(a,c) : ((b>c) : SWAP(b,c))) 

:

error: expected expression before ‘{’ token| 
+0

오류가 발생한 행은 무엇입니까? 오류는 특정 행에서옵니다. – abelenky

+0

pre-processor 출력을 가진 소스를 쓰는 -E 옵션으로 컴파일 – suspectus

+1

내부에 (예 :'{int tmp = a; a = b; b = tmp;}'와 같은 중괄호로 묶은 명령문을 가질 수 없습니다. * expressions * ('x? y : z'와 같은 값으로 평가되는 연산자와 다른 표현식의 그룹들) C 언어에서는 허용되지 않습니다. 만약 당신이 삼항 연산자의 사용을'if/else '문을 사용하면 매크로를 사용하여 정렬 함수를 작성하지 말라고 강력히 권할지라도 괜찮습니다. –

답변

3

은의이 SORT (A, B, C) 매크로를 확장하자. 그것이 컴파일에 실패한 이유입니다.

하면이처럼 정의 :

#define SORT(a,b,c) \ 
    if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) } 

BTW, 그것이 좋은 습관이다 사용하여 여러 매크로를 정의하기 위해 더미 DO-동안 루프 (참조 : C multi-line macro: do/while(0) vs scope block를)

#define SWAP(a,b) do {\ 
int tmp = a; \ 
    a = b; \ 
    b = tmp;} while(0)\ 

이렇게하면 일반 함수 호출처럼 쓸 수 있습니다 :

SWAP(a,b); 
+0

그래, 고마워!하지만 '?'연산자 만 사용하면된다. – yak

+1

아니요 :? : 연산자가 rvalue를 기대하기 때문에 블록 {...}은 rvalue가 아닙니다. –

1

gcc -E를 사용하여 컴파일 할 때 SORT macr 이처럼 확장되었습니다.

(a > b) ? {int tmp = a; a = b; b = tmp;} : ((a > c) ? {int tmp = a; a = c; c = tmp;} : ((b>c) : {int tmp = b; b = c; c = tmp;})) 

여기서 문제는 스왑 기능의 중괄호와 세미 콜론입니다.

0

@Tamas Zahola 당신은 B의 값이 전체 프로그램의 C보다 큰 것입니다 경우 작동하지 않습니다

#define SORT(a,b,c) \ 
if(a > b) { SWAP(a,b) } else if(a > c) { SWAP(a,c) } else if (b>c) { SWAP(b,c) } 

이를 수정해야합니다.