2014-04-20 4 views
0

XOR 두 개의 스왑 두 문자열 리터럴 사용에 대한 빠른 질문이 있습니다. 당신이 볼 수 있듯이XOR을 사용하여 두 포인터를 교환하십시오.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


void intSwap(int *a, int *b){ 
    *a=*a^*b; 
    *b=*a^*b; 
    *a=*a^*b; 
} 


void swapString(char **a, char **b){ 
    char *temp=*a; 
    *a=*b; 
    *b=temp; 
} 

void main(){ 
    char *s= "ha"; 
    char *t= "Oh"; 

    printf("%s and %s \n",s,t); // prints ha Oh 
    swapString(&s,&t); 
    printf("%s and %s \n",s,t); // prints Oh ha 


    int a=10; 
    int b=5; 
    printf("%d %d\n",a,b); //print 10 5 
    intSwap(&a,&b); 
    printf("%d %d\n",a,b); //print 5 10 
} 

, 나는 intSwap에 대한 이진 연산 XOR을 사용 :

그래서 나는 다음 있습니다. 그러나 swapString을 사용하여 동일한 작업을 수행하려고 시도했지만 작동하지 않습니다.

내가 말하는 오류 메시지가 : 유효하지 않은 피연산자^바이너리

는 두 개의 문자열 리터럴를 교환 XOR을 사용하는 방법을 알고 계십니까 ('숯불 *'와 '숯불 *'을 가지고)? C에서 가능합니까? 미리 감사드립니다 !!

+2

을 작동합니다. 그렇게한다면,'intSwap (& a, & a)'를 호출하는 것이 엉망이되지 않도록 추가 논리를 추가해야합니다. –

답변

3

C99 이상을 사용하는 경우 작동하려면 char *intptr_t 번으로 캐스팅 한 다음 작동 후 char * 번으로 캐스팅해야합니다.

귀하의 오류 메시지 : 바이너리

유효하지 않은 피연산자^

당신을 알려줍니다 ('숯불 *'와 '숯불 *'을 가지고) 당신이 개념 권리를 가지고 있지만, 운영자 ^ 포인터에서 작동하지 않습니다.

여분의 변수를 사용하지 않고이 작업을 수행하는 것이 목표 인 경우 (실제로는 현대 컴파일러에서 이 아니라 실제로이 더 효율적 임), 더하기와 빼기를 사용하여 포인터를 충분히 지원할 수 있습니다. 자세한 내용은 See this site을 참조하십시오.

intptr_t은 포인터 값을 보유하기위한 정수 유형입니다. 참고 intptr_t은 완벽하게 이식 가능하지 않습니다 (포인터를 포함 할 수있는 정수 유형이 아님) per this SO answer입니다.

7

포인터에 대한 비트 연산이 없습니다. derefence와 별도로 작동 할 수있는 유일한 작업은 +-입니다. 따라서 intptr_t에 캐스팅해야합니다.

어쨌든, 그것은 나쁜 습관이고 어떤 사이클을 저장하지 않습니다. 컴파일러는 간단한 할당을 사용하여 스왑을 인식하고이를 최적화합니다.

1

* a = * b; b의 한 문자가 전체 문자열이 아닌에 복사된다는 것을 의미합니다. swapString 함수에도 동일하게 적용되므로 잘못된 값이 생성됩니다. 당신은 문자열 길이 1과 동일한하려고하면

이 내가 당신이 어떤 생산 응용 프로그램에서이 코드를 사용하지 않을 희망 ..Thanks Vijayky