C では、未満の変数 (両方を と仮定int
)がある場合、式を使用できます。 i
j
i^=j^=i^=j
2 つの変数の値を交換します。たとえば、let int i = 3
, j = 5
; を計算した後i^=j^=i^=j
、 がi = 5
ありj = 3
ます。
ただし、2 つの int ポインターを使用してこれをやり直すと*i^=*j^=*i^=*j
、上記の例を使用して と にi = 0
なりj = 3
ます。
Cで
1
int i=3, j=5;
i^=j^=i^=j; // after this i = 5, j=3
2
int i = 3, j= 5;
int *pi = &i, *pj = &j;
*pi^=*pj^=*pi^=*pj; // after this, $pi = 0, *pj = 5
JavaScript で
var i=3, j=5;
i^=j^=i^=j; // after this, i = 0, j= 3
JavaScript での結果は、これをより興味深いものにします
私のサンプルコード、ubuntuサーバー11.0およびgcc
#include <stdio.h>
int main(){
int i=7, j=9;
int *pi=&i, *pj=&j;
i^=j^=i^=j;
printf("i=%d j=%d\n", i, j);
i=7, j=9;
*pi^=*pj^=*pi^=*pj
printf("i=%d j=%d\n", *pi, *pj);
}
cでの未定義の動作
c の未定義の動作がこの質問につながる本当の理由でしょうか?
1
Windows 7 で Visual Studio 2005 を使用してコンパイルされたコードは、期待される結果を生成します (出力 i = 7、j = 9 を 2 回)。
2
ubuntu で gcc を使用してコンパイルされたコード( gcc test.c ) は、予期しない結果を生成します (出力 i = 7, j = 9 then i = 0, j = 9 )
3
ubuntu で gcc を使用してコンパイルされたコード( gcc -O test.c ) は、期待される結果を生成します (出力 i = 7,j = 9 を 2 回。)