web-dev-qa-db-ja.com

fun関数の戻り値が7ではなく8なのはなぜですか?

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

35
Ashish Kumar

ステートメントreturn (x = x + 2, x + 1);は次と同等です。

x = x + 2; // x == 7
return x + 1; // returns 8
56
Nathan Xabedi

return (x=x+2,x+1)を書き込む場合、最初の式が最初に評価されるので、_x=x+2_が評価され、副作用としてxが7になります。次に、2番目の式が評価されて返されます。したがって、関数はx + 1を返すため、8を返します。

return (x+2,x+1);を記述した場合、最初の式_x+2_には副作用がないため、結果は6になります。

15
Corentin Pane

returnの両方の部分がそれぞれ評価され、最後の命令の結果が返されます。

最初に私達は持っています:

x = x + 2 // 7

xは、2回目の評価の前に7に更新されます。

x + 1 // 7 + 1 = 8

最後に8を返します。

理解を深めるために、次のように中間変数の場合を検討してください。

return (y = x + 2, y + 1);
12
XBlueCode

便利に州をリンクした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ずつインクリメントされ、結果が返されます。

6
lucidbrot

それは演算子の優先順位の問題です。

_x=x+2,x+1_は、x=(x+2,x+1)ではなく_(x=x+2), (x+1)_として評価されます

3
RiaD

他のユーザーが述べたように、コマンドフローは左から右に進み、returnの場合、右端の演算子の値が返されます。この演算子の前に記述され、コンマで区切られたものは、行で記述された式と同じです。例:

return (x = x + 2, x = x - 5, x + 1);

以下のコードは同じ結果を生成します:

x = x + 2;  
x = x - 5;
return x + 1;

x = 0の場合、これは-2を返します。両方のコードで、x = x - 5x - 5に変更すると、つまり、xから5を減算しますが、結果をどこにも保存しないことに注意してください。 x3に変わるため、同等であることを確認します。

3
Egodev

コンマ演算子は、コードにシーケンスポイントを導入します。ステートメントは次の順序で評価されます。

  1. x = x + 2、この時点で、xのローカルfunは7です。

  2. x + 1、これは8に評価され、返されます。

明確にするために、演算子の優先順位を示す括弧付きのバージョンを次に示します。

return (x=x+2),x+1;

左側の式が評価され、その値は破棄されます。右側の式の値が返されます。

0
S.S. Anne