-1

ビットごとの計算を行い、2 つの変数を交換するマクロを入力したかった

プログラムでそのコードを何度も入力する代わりに、マクロを次のように使用することにしました。

#define swapVars(p,a,b) {p=a^b;a=^p;b=^p;}

コードでマクロを使用する場合

int a = 10, b=19;
int swap_dummy = 0; //May contain anything
swapVars(swap_dummy, a, b);
printf("a = %d   | b = %d", a, b);

差し替えでエラーが出ました。マクロ定義が間違っていませんか?(ちなみに、そうである必要があります)。この状況に適したマクロは何ですか?

4

2 に答える 2

3

=^代わりに有効ではありません^=。通常の割り当てが正常に機能するのに、なぜビット単位の xor を使用しているのかは明らかではありません。

しかし、なぜこれがマクロであってはならないのかについての質問へのコメントを実際に見てください。

于 2013-02-17T05:13:06.780 に答える
2

この質問は、「問題を間違った方法で解決するにはどうすればよいですか?」によく似ています。

マクロは、xorスワップの誤った実装のようです。xorスワップの修正を支援するのではなく、問題を正しい方法で解決できるように支援します。xorスワップは興味深い概念ですが、実際の使用法はありません。それが時期尚早の最適化ではないことを確認しますか?

  1. 一時変数の交換とは異なり、慣用的なものではありません。まず、一時変数のスワップを記述していれば、この問題は発生しなかったでしょう。さらに、同僚にコードを説明するために時間をかける必要がある場合は、職場のより重要な最適化を検討することをお勧めします。
  2. この場合、通常のスワップほど定義されていません。値にxorを使用intすると、負のゼロなどのトラップ表現が発生する可能性があります。トラップ表現の使用は未定義の動作です。未定義の動作は、プログラムが非常に奇妙な方法で誤動作する原因となる可能性があります。
  3. コンパイラーは、より一般的で明確に定義されたコードをコンパイルする際により良い仕事をします。コンパイラに時期尚早の最適化を行わせてください。

inlineキーワードについて:時期尚早に最適化を停止します。あなたが私たちの助けを求めることができるように、シンプルで読みやすいコードであなたのプログラムを正しく動作させてください。実用的なソリューションができたら、必要に応じてプロファイルを作成し、最も重要な最適化がどこから来るのかを調べます。

于 2013-02-17T05:18:54.917 に答える