C関数でのカンマ区切りの戻り引数[複製] を参照して、
x=x+2,x+1;
として評価されます
x=x+2;
ただし、次のコードの場合
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
次のように評価されるべきではない[A]
x=x+2;
x = 7
ステートメントreturn (x = x + 2, x + 1);
は次と同等です。
x = x + 2; // x == 7
return x + 1; // returns 8
return (x=x+2,x+1)
を書き込む場合、最初の式が最初に評価されるので、_x=x+2
_が評価され、副作用としてxが7になります。次に、2番目の式が評価されて返されます。したがって、関数はx + 1を返すため、8を返します。
return (x+2,x+1);
を記述した場合、最初の式_x+2
_には副作用がないため、結果は6になります。
return
の両方の部分がそれぞれ評価され、最後の命令の結果が返されます。
最初に私達は持っています:
x = x + 2 // 7
x
は、2回目の評価の前に7
に更新されます。
x + 1 // 7 + 1 = 8
最後に8
を返します。
理解を深めるために、次のように中間変数の場合を検討してください。
return (y = x + 2, y + 1);
便利に州をリンクしたQA
コンマ演算子は、一連の式を評価します。コンマグループの値は、リストの最後の要素の値です。
だからの価値
x+2,x+1;
はx+1
および副作用はありません。
サンプルコード:
#include<stdio.h>
int main(int argc, char * argv){
int x;
x = 0;
x = (x+2, x+1);
printf("%d\n", x);
return 0;
}
結果は1
実行時。
しかし、あなたがするとき
return (x=x+2, x+1)
あなた副作用があります:x
は最初に2ずつインクリメントされ、次にx
が1ずつインクリメントされ、結果が返されます。
それは演算子の優先順位の問題です。
_x=x+2,x+1
_は、x=(x+2,x+1)
ではなく_(x=x+2), (x+1)
_として評価されます
他のユーザーが述べたように、コマンドフローは左から右に進み、return
の場合、右端の演算子の値が返されます。この演算子の前に記述され、コンマで区切られたものは、行で記述された式と同じです。例:
return (x = x + 2, x = x - 5, x + 1);
以下のコードは同じ結果を生成します:
x = x + 2;
x = x - 5;
return x + 1;
x = 0
の場合、これは-2
を返します。両方のコードで、x = x - 5
をx - 5
に変更すると、つまり、x
から5
を減算しますが、結果をどこにも保存しないことに注意してください。 x
は3
に変わるため、同等であることを確認します。
コンマ演算子は、コードにシーケンスポイントを導入します。ステートメントは次の順序で評価されます。
x = x + 2
、この時点で、x
のローカルfun
は7です。
x + 1
、これは8に評価され、返されます。
明確にするために、演算子の優先順位を示す括弧付きのバージョンを次に示します。
return (x=x+2),x+1;
左側の式が評価され、その値は破棄されます。右側の式の値が返されます。