50

次のコードは値 9 を出力します。なぜですか? ここでreturn(i++)は値11が返され、値--i自体が10であるため、これがどのように機能するか説明できますか?

#include<stdio.h>
main()
{
    int i= fun(10);
    printf("%d\n",--i);
}

int fun (int i)
{
    return(i++);
}
4

13 に答える 13

83

の後置バージョンと前置バージョンには大きな違いがあります++

プレフィックス バージョン (つまり++i) では、 の値iが増加し、式の値は の新しい値になりiます。

後置バージョン (つまりi++) では、 の値iがインクリメントされますが、式の値は の元の値ですi

次のコードを 1 行ずつ分析してみましょう。

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i10(簡単)に設定されています。
  2. この行の 2 つのこと:
    • iにインクリメントされ11ます。
    • 新しいiが にコピーされjます。だからj今等しいです11
  3. この行にも2つのことがあります:
    • iにインクリメントされ12ます。
    • ( は)の元の値が にコピーされます。だから今等しいです。i11kk11

したがって、コードを実行した後iは 12 になりますが、両方ともj11kになります。

の後置バージョンと前置バージョンについても同じことが言えます--

于 2011-08-11T19:05:40.973 に答える
10

i後置演算子 (++) を使用しているため、インクリメントされる前に関数が返されます。いずれにせよ、 のインクリメントiはグローバルではなく、それぞれの関数に対してのみです。前置演算子を使用した場合は、11にデクリメントされ10ます。

したがってi、10 として返され、printf 関数でデクリメントされますが、これは思ったほどでは9ありません10

于 2011-08-11T19:01:13.837 に答える
7

実際return (i++)には 10 しか返されません。

++ および -- 演算子は、変数の前後に配置でき、異なる効果があります。それらが前にある場合、それらは処理されて返され、基本的に (i-1) または (i+1) と同じように扱われますが、i の後に ++ または -- を配置すると、戻りは本質的に

return i;
i + 1;

したがって、10 が返され、インクリメントされることはありません。

于 2011-08-11T19:02:36.730 に答える
4

後置インクリメント++は、評価されるまでオペランドの値を増やしません。の値はi++ですi

前置デクリメントは、評価される前にそのオペランドの値を増やします。の値は--iですi - 1

プレフィックスのインクリメント/デクリメントは、式が評価される前に値を変更します。後置インクリメント/デクリメントは後の値を変更します。

したがって、あなたの場合、fun(10)10 を返し、印刷--iするi - 1と 9 が印刷されます。

于 2011-08-11T19:01:28.897 に答える
4

これをできるだけ単純にしましょう。

let i = 1
console.log('A', i)    // 1
console.log('B', ++i)  // 2
console.log('C', i++)  // 2
console.log('D', i)    // 3

A) I の値を出力します。

B) 最初に i がインクリメントされ、次に新しい値である i を使用して console.log が実行されます。

C) Console.log は i を現在の値で実行すると、i がインクリメントされます。

D) i の値を出力します。

つまり、プレショートハンド ie(++i) を使用すると、行が実行される前に更新されます。post-shorthand ie(i++) を使用すると、現在の行は I がまだ更新されていないかのように実行され、i が増加するため、次にインタープリターが遭遇したときに i が増加します。

于 2020-06-29T22:18:56.783 に答える
3

i++ はポスト インクリメントです。増分は、値が返された後に行われます。

于 2011-08-11T19:01:41.527 に答える
3

まず、という名前の関数パラメーターとiniという名前の変数は、 2 つの異なる変数であることに注意してください。それは現在の議論にはそれほど重要ではないと思いますが、知っておくことは重要です。imain()

次に、ポストインクリメント演算子を で使用しますfun()。つまり、式の結果はインクリメントされる前の値です。 iの最終値 11iは単純に破棄され、関数は 10 を返します。i別の変数である main に戻る変数には値 10 が割り当てられ、それをデクリメントして 9 を取得します。

于 2011-08-11T19:02:04.630 に答える
3

説明:

ステップ 1: int fun(int);ここで、関数のプロトタイプを宣言しますfun()

ステップ 2: int i = fun(10);変数 i は整数型として宣言され、の結果はfun(10)variable に格納されますi

ステップ 3: int fun(int i){ return (i++); }内部fun()で value を返しますreturn(i++)。返します10i++ポストインクリメント演算子であるためです。

ステップ 4:次に、コントロールが main 関数に戻り、値10が variable に割り当てられますi

ステップ 5: printf("%d\n", --i);ここで--iは pre-increment を示します。したがって、値を出力します9

于 2016-02-07T15:22:59.700 に答える
2

これは、ポストインクリメント演算子の動作に関係しています。i の値を返し、値をインクリメントします。

于 2011-08-11T19:01:32.150 に答える
2

実際には、postfix 、つまり i++ を使用すると、インクリメントされた値ではなく、i の初期値が返されます。この後、i の値は 1 ずつ増加します。これは、i++ を使用するすべてのステートメントで発生します。つまり、i の最初の初期値が式で使用され、その後インクリメントされます。

接頭辞では正反対のことが起こります。++i を返す場合は、1 の加算が最初に実行されてから返されるため、インクリメントされた値、つまり 11 が返されます。

于 2015-12-14T18:09:04.080 に答える
1

fun(10) は 10 を返します。11 を返したい場合は、i++ ではなく ++i を使用する必要があります。

int fun(int i)
{
    return ++i;
}
于 2011-08-11T19:01:51.877 に答える