0

次のコード スニペットを見つけました。

#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;
4

3 に答える 3

6

このアルゴリズムは、次の行で未定義の動作を引き起こすため機能しません。

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 の質問がいくつかあります。

于 2014-07-17T20:22:03.860 に答える
2

ブラケットが最初に実行されると思いました...

それは無効な仮定です。括弧は、式内の演算子の優先順位に影響を与えます。実行順序は指定しません。の

 a = b + c + (d * e);

b + cの前に が計算される可能性があります(d * e)。またはそうではないかもしれません。C 言語標準では、部分式の評価の順序は規定されていません。投稿したコードは、介在するシーケンス ポイントなしで読み書きされるため、未定義の動作を呼び出します。y括弧はシーケンス ポイントを導入しないことに注意してください (セミコロンは導入します)。

于 2014-07-17T20:25:31.913 に答える