1

上記のコード ブロックでは、行がどのように機能しているかを理解しようとしてreturn reverse((i++, i))います。

#include <stdio.h>
        void reverse(int i);
        int main()
        {
            reverse(1);
        }
        void reverse(int i)
        {
            if (i > 5)
                return ;
            printf("%d ", i);
    //        return reverse(i++); -- stack overflow
            return reverse((i++, i));
        }

同様に機能する以下のコードも見つけました。

#include <stdio.h>
    int main()
    {
        int y = 1, x = 0;
        int l = (y++, x++) ? y : x;
        printf("%d\n", l);
    }

質問が非常に基本的なもので申し訳ありません。とてもわかりにくかったと思います。誰かが説明できるなら、それは役に立ちます。

4

1 に答える 1

4

最初のコードでは、

  • ケース 1:

    return reverse(i++);
    

    変更 iされていない値が関数の引数として使用されるため (ポスト インクリメントの効果は関数呼び出しの後に順序付けられるため)、スタック オーバーフローが発生し、その後i増加されます。したがって、基本的にはreverse()引数を変更せずに呼び出しており、無限再帰が発生します。

  • ケース 2:

    大戸、

    return reverse((i++, i));
    

    基本的に左側の式を評価し、値を破棄し、最後に (つまり、コンマ演算子を使用した結果) 右側の式の評価の型と値を返します。そのため、 の更新された値がi関数の引数として使用されます。

    書くことと同等です。

    return reverse(++i);    //pre-inrement
    

    更新されたiが使用されます。


2番目のコードでは、

  int l = (y++, x++) ? y : x;

以下の順番で評価されます

  • y++評価され、結果は無視されます。y増加します。
  • x++評価され、結果は三項演算子と見なされます。それは偽です。(覚えておいてください、ポストインクリメント)。次に、x増加します(ポストインクリメント)。
  • 三項演算子の規則に従って、最初のオペランド (式) が FALSE (0 に評価される) の場合、3 番目の (オペランド) 式が評価され、値が返されます。
  • に格納されるのインクリメントされた 値、つまりを返します。xl1
于 2015-06-23T07:00:21.560 に答える