2011-08-16 15 views
2
#include <stdio.h> 

void fun(char a[]){ 

    a[0]^=a[1]^=a[0]^=a[1]; 

} 

int main(int argc, char **argv){ 

    char b[10]; 
    b[0]='h'; 
    b[1]='j'; 
    fun(b); 
    printf("%c",b[0]); 

    return 0; 
} 

このコードでは何が問題になりますか。それはb[0]b[1]を交換するが、それは入れ替えられていない。XOR出力予測のスワップ

+3

XORを忘れて一時的に使用してください。読みやすく、信頼性が高く、おそらくより効率的です。 –

+0

おかしなことをやっていないのに、人々が彼らの関数をfun()と呼ぶのは面白いです。 SCNR :-) – glglgl

答えて

11

の場合はa[0]^=a[1]^=a[0]^=a[1];です。評価と割り当ての順序は定義されていません。

+2

+1 C99 6.5/2: "前のシーケンスポイントと次のシーケンスポイントの間で、オブジェクトは、最大でも1回の式の評価によって変更された記憶値を持たなければなりません。保存する価値がある " –

+0

いいえ私は 'チェーンなしでそれを試してみたと言うつもりだった^ = – Kevin

3

The New C Standard. An Economic and Cultural Commentary」本はページ1104において、XORスワップの二つの変形を与える:

Example 
1 #define SWAP(x, y) (x=(x^y), y=(x^y), x=(x^y)) 

2 #define UNDEFINED_SWAP(x, y) (x ^= y ^= x ^= y) 
    /* Requires right to left evaluation. */ 

ので、第二の変形は、ポータブルではなく、間違っています。