次のコードは値 9 を出力します。なぜですか? ここでreturn(i++)は値11が返され、値--i自体が10であるため、これがどのように機能するか説明できますか?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
次のコードは値 9 を出力します。なぜですか? ここでreturn(i++)は値11が返され、値--i自体が10であるため、これがどのように機能するか説明できますか?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
の後置バージョンと前置バージョンには大きな違いがあります++。
プレフィックス バージョン (つまり++i) では、 の値iが増加し、式の値は の新しい値になりiます。
後置バージョン (つまりi++) では、 の値iがインクリメントされますが、式の値は の元の値ですi。
次のコードを 1 行ずつ分析してみましょう。
int i = 10; // (1)
int j = ++i; // (2)
int k = i++; // (3)
i10(簡単)に設定されています。iにインクリメントされ11ます。iが にコピーされjます。だからj今等しいです11。iにインクリメントされ12ます。i11kk11したがって、コードを実行した後iは 12 になりますが、両方ともj11kになります。
の後置バージョンと前置バージョンについても同じことが言えます--。
i後置演算子 (++) を使用しているため、インクリメントされる前に関数が返されます。いずれにせよ、 のインクリメントiはグローバルではなく、それぞれの関数に対してのみです。前置演算子を使用した場合は、11にデクリメントされ10ます。
したがってi、10 として返され、printf 関数でデクリメントされますが、これは思ったほどでは9ありません10。
実際return (i++)には 10 しか返されません。
++ および -- 演算子は、変数の前後に配置でき、異なる効果があります。それらが前にある場合、それらは処理されて返され、基本的に (i-1) または (i+1) と同じように扱われますが、i の後に ++ または -- を配置すると、戻りは本質的に
return i;
i + 1;
したがって、10 が返され、インクリメントされることはありません。
後置インクリメント++は、評価されるまでオペランドの値を増やしません。の値はi++ですi。
前置デクリメントは、評価される前にそのオペランドの値を増やします。の値は--iですi - 1。
プレフィックスのインクリメント/デクリメントは、式が評価される前に値を変更します。後置インクリメント/デクリメントは後の値を変更します。
したがって、あなたの場合、fun(10)10 を返し、印刷--iするi - 1と 9 が印刷されます。
これをできるだけ単純にしましょう。
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 が増加します。
i++ はポスト インクリメントです。増分は、値が返された後に行われます。
まず、という名前の関数パラメーターとiniという名前の変数は、 2 つの異なる変数であることに注意してください。それは現在の議論にはそれほど重要ではないと思いますが、知っておくことは重要です。imain()
次に、ポストインクリメント演算子を で使用しますfun()。つまり、式の結果はインクリメントされる前の値です。 iの最終値 11iは単純に破棄され、関数は 10 を返します。i別の変数である main に戻る変数には値 10 が割り当てられ、それをデクリメントして 9 を取得します。
説明:
ステップ 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++)。返します10。i++ポストインクリメント演算子であるためです。
ステップ 4:次に、コントロールが main 関数に戻り、値10が variable に割り当てられますi。
ステップ 5: printf("%d\n", --i);ここで--iは pre-increment を示します。したがって、値を出力します9。
これは、ポストインクリメント演算子の動作に関係しています。i の値を返し、値をインクリメントします。
実際には、postfix 、つまり i++ を使用すると、インクリメントされた値ではなく、i の初期値が返されます。この後、i の値は 1 ずつ増加します。これは、i++ を使用するすべてのステートメントで発生します。つまり、i の最初の初期値が式で使用され、その後インクリメントされます。
接頭辞では正反対のことが起こります。++i を返す場合は、1 の加算が最初に実行されてから返されるため、インクリメントされた値、つまり 11 が返されます。
fun(10) は 10 を返します。11 を返したい場合は、i++ ではなく ++i を使用する必要があります。
int fun(int i)
{
return ++i;
}