[ハードコアファーストフード]C言語で2変数値を交換する6つの方法


1中間変数の作成
これは最も速くて最も簡単な方法です.
#include
 
int main()
{
    int a=10;
    int b=20;
    int temp;
    printf("   a,b   :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); temp=b; b=a; a=temp; printf(" a,b :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); return 0; }

2関数交換法
呼び出し関数は2つの数の値を交換します
#include
 
void swap(int *p1,int *p2)
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
 
int main()
{
    int a=10;
    int b=20;
    printf("   a,b     :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); swap(&a,&b); printf(" a,b :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); return 0; }

3加算減算または乗算除算で交換
#include
 
int main()
{
    int a=10;
    int b=20;
    printf("   a,b     :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); a=a+b; //a=a*b; b=a-b; //b=a/b; a=a-b; //a=a/b; printf(" a,b :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); }

注意:この2つの方法は境界を越えやすいので、慎重に使用してください.
だからこの方法には欠陥がありますが、似たような溢れない方法はありますか?答えは肯定的で、あります.次はこのような溢れない方法を見てみましょう.
4異種または交換法(a,bが等しい場合は使用できない)
この方法をマスターするには、異或とは何かを知る必要があります.異和:一般的にはバイナリ数について言えば、そのルールは2つのバイナリ数が異なる場合、異種または結果は1である.例外または結果は0です.この方法は3つ目と似ているように見えますが、それよりも厳格です.なぜなら、上記のように、加減乗除という方法ではオーバーフローエラーが発生する可能性が高いが、異なるか、まったく発生しないからだ.2つのバイナリ数が異なる結果は0または1にすぎないため、キャリーやビットは生成されず、変数の表示範囲を超えません.
#include
 
int main()
{
    int a=10;
    int b=20;
    printf("   a,b     :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); a=a^b; b=a^b; a=a^b; printf(" a,b :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); }

5用ビット演算交換
最后に、高逼格の方法を绍介します.考えている人は少ないです.int 64は64ビット整数変数を表し、これはVC 6である.0里はサポートされています.b = (__int64)((__int64)a << 32 | (a = b)) >> 32;この文のa=bの値はbの値20であり、同時にbの値をaに与える.まずaを64ビット整数変数に強制的に変換し、そしてそれを左に32ビットずらして(a=b)とビットを押すか、結果全体を強制的に64ビット整数変数に変換し、右に32ビットずらしてbの値を得る.実は、bの値を求めるには|(a=b)という部分は必要ないが、同時にbの値をaに与え、|(a=b)ここに置くとbの最終的な値に影響しないので、こう書きます.ここではシフト法を用いて中間変数の使用を回避します.

```c
#include
 
int main()
{
    int a=10;
    int b=20;
    printf("   a,b     :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); b = (__int64)((__int64)a << 32 | (a = b)) >> 32; printf(" a,b :
"
); printf("a=%d
"
,a); printf("b=%d
"
,b); return 0; }

6ポインタ交換法の解釈:この方法はポインタを交換するために利用され、初心者がポインタを学んでいない人は先に見て、あるいは後で帰って見ることができます.
#include
int main(void)
{
     int a=1,b=2;
     int &ptr_a=a,&ptr_b=b;
     int tep;
     
     tep=*ptr_a;
     *ptr_a=*ptr_b;
     *ptr_b=tep;
     
     printf("%d %d",a,b);
     return 0;
 }

(本文はネット記事+個人補足に転載)
ps:それから、公众号(同年新月)が开かれてから一ヶ月が経ちました.百を过ぎたばかりの同年に注目してくれて、本当に悲しいですね.同じ年に友达に分かち合ってもらいましょう.一绪に顽张りましょう.公众号には古典的なプログラミング本の电子版がたくさんあります.同时に、私は毎周勉强の过程の重难点をまとめます.同じ年にも积极的に投稿することができます.入选者にはご褒美があります.(例えば古典書など)、一緒に頑張りましょう!