C에 스왑 기능이 내장되어 있습니까?
C에 세 번째 변수를 사용하지 않고 작동하는 내장 스왑 기능이 있습니까?
아니요.
C++ 내장 스왑 기능:swap(first,second);
확인하기: http://www.cplusplus.com/reference/algorithm/swap/
세 번째 변수를 사용하지 않고 두 변수 값을 스왑할 수 있습니다.
a=a^b;
b=a^b;
a=b^a;
다음 항목도 확인할 수 있습니다.
세 번째 변수를 사용하지 않으려는 이유는 무엇입니까?대부분의 아키텍처에서 가장 빠른 방법입니다.
XOR 스왑 알고리즘은 세 번째 변수 없이 작동하지만 두 가지 방식으로 문제가 있습니다.
- 변수가 서로 달라야 합니다.
swap(&a, &a)작동하지 않습니다. - 일반적으로 속도가 느립니다.
세 번째 변수를 사용하면 스택이 유출될 수 있는 경우 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
'programing' 카테고리의 다른 글
| CSS 호버 이벤트에서 다른 디브의 스타일링을 변경할 수 있습니까? (0) | 2023.09.06 |
|---|---|
| jQuery bind to Paste Event, 붙여넣기 내용을 가져오는 방법 (0) | 2023.09.06 |
| contentEditable에 contentEditable에 contentEditable에 (0) | 2023.09.06 |
| Python3, MariaDB, OpenVPN 암호 확인 실패 (0) | 2023.09.06 |
| DBever Community Edition에서 Excel 내보내기 옵션은 어디에 있습니까? (0) | 2023.09.06 |