programing

C에 스왑 기능이 내장되어 있습니까?

easyjava 2023. 9. 6. 23:07
반응형

C에 스왑 기능이 내장되어 있습니까?

C에 세 번째 변수를 사용하지 않고 작동하는 내장 스왑 기능이 있습니까?

아니요.
C++ 내장 스왑 기능:swap(first,second);
확인하기: http://www.cplusplus.com/reference/algorithm/swap/

세 번째 변수를 사용하지 않고 두 변수 값을 스왑할 수 있습니다.

a=a^b;
b=a^b;
a=b^a;

다음 항목도 확인할 수 있습니다.

https://stackoverflow.com/questions/756750/swap-the-values-of-two-variables-without-using-third-variable

세 번째 변수 없이 스왑하는 방법?

세 번째 변수를 사용하지 않으려는 이유는 무엇입니까?대부분의 아키텍처에서 가장 빠른 방법입니다.

XOR 스왑 알고리즘은 세 번째 변수 없이 작동하지만 두 가지 방식으로 문제가 있습니다.

  1. 변수가 서로 달라야 합니다.swap(&a, &a)작동하지 않습니다.
  2. 일반적으로 속도가 느립니다.

세 번째 변수를 사용하면 스택이 유출될 수 있는 경우 XOR 스왑을 사용하는 것이 좋을 수도 있지만, 일반적으로 그러한 상황에 있지는 않습니다.

당신의 질문에 직접 답하자면, 표준 C에는 쓰기에는 사소한 것이지만 스왑 기능이 없습니다.

C++가 아닌 C 솔션을 원한다면 적어도 GCC 확장을 사용하여 매크로로 만들어 제네릭을 충분히 가질 수 있습니다.

 #define SWAP(x,y) do {   \ 
   typeof(x) _x = x;      \
   typeof(y) _y = y;      \
   x = _y;                \
   y = _x;                \
 } while(0)

책동 같은 속임수를 조심함.swap(t[i++],i); 이를 피하려면 주소 연산자를 사용합니다.&. 그리고 임시적인 방법을 사용하는 것이 좋습니다(정수의 경우, 배타적인 -or와 함께 유명하고 쓸모없는 속임수가 있습니다).

추신: 두 개의 지역 변수를 사용하고 있습니다._x그리고._y가독성을 높이고 컴파일러에서 더 많은 최적화를 가능하게 하기 위해 로컬 변수를 하나만 사용할 수도 있었습니다.

표준 C에는 그런 기능이 없습니다.

(C++에는 있습니다.)


아마도질문의 매크로는 당신에게 유용할 수 있을 것입니다.

C에는 두 변수를 스왑할 수 있는 표준 함수가 없습니다.

매크로는 다음과 같은 방식으로 쓸 수 있습니다.

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

매크로는 다음과 같이 부를 수 있습니다.

int a = 42;
int b = 2718;

SWAP(int, a, b);

스왑 매크로를 쓰기 위한 몇 가지 해결책은 피해야 합니다.

#define SWAP(a, b) do { a = b + a; b = a - b; a = a - b; } while (0)

피연산자가 서명된 유형이면 오버플로가 발생할 수 있으며 서명된 오버플로는 정의되지 않은 동작입니다.

또한 이와 같이 XOR 솔루션을 최적화하려는 솔루션은 피해야 합니다.

#define SWAP(a, b) (a ^= b ^= a ^=b)

a는 이전 시퀀스 포인트와 다음 시퀀스 포인트 사이에서 두 번 수정되므로 시퀀스 포인트 규칙을 위반하고 정의되지 않은 동작입니다.

개체 표현을 C의 부호 없는 문자 배열에 복사할 수 있으므로 다음 매크로를 사용하여 두 개체를 바꿀 수 있습니다.

#define SWAP(X,Y) \
    do { \
        unsigned char _buf[sizeof(*(X))]; \
        memmove(_buf, (X), sizeof(_buf)); \
        memmove((X),  (Y), sizeof(_buf)); \
        memmove((Y), _buf, sizeof(_buf)); \
    } while (0)

GCC는 경우에 따라 이에 맞는 최적의 코드를 생성할 수도 있습니다.직업을 계속 유지하지 못할 수도 있습니다.

C++ 라이브러리 기능이 있습니다.두 정수 변수의 값을 스왑합니다.예를 들어, swap(x, y); 변수 x와 y의 값을 swap합니다.마찬가지로 스왑(mat[i][j], mat[j][i])은 행렬 매트의 두 값, 즉 i행 j열의 값과 i행 j열의 값을 스왑합니다.

#define swap(T, x, y) \
    {                 \
        T tmp = x;    \
        x = y;        \
        y = tmp;      \
    }

int main()
{
    int a = 10;
    int b = 20;
    printf("a=%d b=%d\n", a, b);
    swap(int, a, b);
    printf("a=%d b=%d\n", a, b);

    return 0;
}

기본 제공되는 스왑 기능은 없지만 시도해 볼 수 있습니다.

a = a ^ b;

b = a ^ b;

a = b ^ a;

저는 표준 C의 두 값을 교환하는 타입 아그노스틱 함수를 생각해 냈다고 생각합니다. 하지만 제가 언어를 처음 접했기 때문에 뭔가를 간과했을 수도 있습니다.XOR 스왑 알고리즘을 사용하며, 더 최적화될 수 있을 것이라 확신합니다. 하지만 두 값이 세 번째 인수로 지정된 동일한 바이트 수를 가리키기만 하면 작동합니다.

void swapn(void *a, void *b, size_t n) {
    if (a == b) {
        return;
    }

    size_t i;
    char *x = (char *)a,
        *y = (char *)b;

    for (i = 0; i < n; i++) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
        x++;
        y++;
    }
}

사용 예시:

// swap two integers
int x = 5,
    y = 30;

printf("%d\t%d\n", x, y);

swapn(&x, &y, sizeof(int));

printf("%d\t%d\n\n", x, y);

// swap two floats
float a = 9.23f,
    b = 6.83f;

printf("%.2f\t%.2f\n", a, b);

swapn(&a, &b, sizeof(float));

printf("%.2f\t%.2f\n\n", a, b);

// swap two doubles
double p = 4.7539,
    q = 0.9841;

printf("%.4f\t%.4f\n", p, q);

swapn(&p, &q, sizeof(double));

printf("%.4f\t%.4f\n\n", p, q);

// swap two chars
char m = 'M',
    n = 'n';

printf("%c\t%c\n", m, n);

swapn(&m, &n, sizeof(char));

printf("%c\t%c\n\n", m, n);

// swap two strings of equivalent length
char s[] = "Hello",
    t[] = "World";

printf("%s\t%s\n", s, t);

swapn(s, t, sizeof(s));

printf("%s\t%s\n\n", s, t);

출력은 다음과 같습니다.

5   30
30  5

9.23    6.83
6.83    9.23

4.7539  0.9841
0.9841  4.7539

M   n
n   M

Hello   World
World   Hello

언급URL : https://stackoverflow.com/questions/8862136/is-there-a-built-in-swap-function-in-c

반응형