次のコード スニペットを見つけました。
#include <stdio.h>
int main(void) {
int x=10,y=15;
x=x+y-(y=x);
printf("x=%d y=%d",x,y);
return 0;
}
実際に変数を交換します
コードが変数を交換する方法を誰か説明してもらえますか?
括弧が最初に実行され、次に式が続くと思いました
x=x+y-y;
次のコード スニペットを見つけました。
#include <stdio.h>
int main(void) {
int x=10,y=15;
x=x+y-(y=x);
printf("x=%d y=%d",x,y);
return 0;
}
実際に変数を交換します
コードが変数を交換する方法を誰か説明してもらえますか?
括弧が最初に実行され、次に式が続くと思いました
x=x+y-y;
このアルゴリズムは、次の行で未定義の動作を引き起こすため機能しません。
x=x+y-(y=x);
^ ^
ドラフト C99 標準のy
セクションごとに、同じシーケンス ポイント内でその値を変更して使用しています。6.5
前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトは、式の評価によって最大 1 回変更された格納された値を持つ必要があります。
部分式の評価順序が指定されていないため、指定されていない動作の問題もあります。
演算子とオペランドのグループ化は、構文によって示されます.74) 後で指定される場合を除き (関数呼び出し ()、&&、||、?:、およびコンマ演算子について)、部分式の評価の順序およびどちらの副作用が発生するかは、どちらも特定されていません。
この場合、それを使用しclang
ていた場合、次の警告が表示されます。
warning: unsequenced modification and access to 'y' [-Wunsequenced]
x=x+y-(y=x);
~ ^
デフォルトでわかる限り。gcc
を使用して、から同様の警告を受け取ることができます-Wall
。
Swapping two variable value without using 3rd variableなど、一時的なものなしでスワップする方法をカバーする SO の質問がいくつかあります。
ブラケットが最初に実行されると思いました...
それは無効な仮定です。括弧は、式内の演算子の優先順位に影響を与えます。実行順序は指定しません。の
a = b + c + (d * e);
b + c
の前に が計算される可能性があります(d * e)
。またはそうではないかもしれません。C 言語標準では、部分式の評価の順序は規定されていません。投稿したコードは、介在するシーケンス ポイントなしで読み書きされるため、未定義の動作を呼び出します。y
括弧はシーケンス ポイントを導入しないことに注意してください (セミコロンは導入します)。