次のコードは値 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)
i
10
(簡単)に設定されています。i
にインクリメントされ11
ます。i
が にコピーされj
ます。だからj
今等しいです11
。i
にインクリメントされ12
ます。i
11
k
k
11
したがって、コードを実行した後i
は 12 になりますが、両方ともj
11k
になります。
の後置バージョンと前置バージョンについても同じことが言えます--
。
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 つの異なる変数であることに注意してください。それは現在の議論にはそれほど重要ではないと思いますが、知っておくことは重要です。i
main()
次に、ポストインクリメント演算子を で使用します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;
}