次のコードは値9を出力します。なぜですか?ここで、return(i++)
は11の値を返し、--i
値は10そのものである必要がありますが、これがどのように機能するか説明できますか?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
++
の接尾辞と接頭辞のバージョンにはbigの違いがあります。
プレフィックスバージョン(つまり、++i
)では、i
の値がインクリメントされ、式の値はnewの値i
です。
後置バージョン(つまり、i++
)では、i
の値は増加しますが、式の値は元i
の値です。
次のコードを行ごとに分析してみましょう。
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
とk
は両方とも11になります。
--
の接尾辞と接頭辞のバージョンにも同じことが当てはまります。
プレフィックス:
int a=0;
int b=++a; // b=1,a=1
割り当ての前に値が増加します。
後置:
int a=0;
int b=a++; // a=1,b=0
最初に「a」の値を「b」に割り当て、次に「a」の値を増分します
関数は、修正後演算子(++)を使用しているため、i
がインクリメントされる前に戻ります。いずれにしても、i
の増分はグローバルではなく、それぞれの関数に対してのみです。プレフィックス演算子を使用した場合、11
そして、10
。
したがって、i
を10として返し、printf関数でデクリメントして、9
not 10
あなたが考えるように。
実際、return (i++)
は10のみを返します。
++および-演算子は、変数の前後に配置でき、さまざまな効果があります。それらが前にある場合、それらは処理されて返され、基本的に(i-1)または(i + 1)と同様に処理されますが、iの後に++または-を配置すると、戻りは本質的に
return i;
i + 1;
したがって、10を返し、それを増分しません。
後置インクリメント_++
_は、評価されるまでオペランドの値を増やしません。 _i++
_の値はi
です。
プレフィックスのデクリメントは、オペランドの値を増やしますbefore評価されました。 _--i
_の値は_i - 1
_です。
プレフィックスの増分/減分は、式が評価される前に値を変更します。後置インクリメント/デクリメントは後の値を変更します。
したがって、あなたの場合、fun(10)
は10を返し、_--i
_を出力すると_i - 1
_(9)が出力されます。
i ++はポストインクリメントです。値が返された後に増分が行われます。
違いを示す2つの例があります
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , c++);
a = 1
の値とc = 1
の値に割り当てます。次のステートメントassiagnのc = 1
の値をbに、次にcを1ずつインクリメントして、b = 1
の値とc = 2
の値
printf
ステートメントにはc++
があります。これは、2であるcの元の値が出力され、cを1インクリメントするため、printf
ステートメントは1 1 2
とcは3
http://pythontutor.com/c.html を使用できます
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
printf
ステートメント++c
は、最初にcの値を1増やし、次にcに新しい値3を割り当てるので、printf
ステートメントは1 1 3
を出力しますポストインクリメント演算子の動作方法に関係しています。 iの値を返し、値をインクリメントします。
最初に、i
という名前の関数パラメーターとmain()
のi
という名前の変数は2つの異なる変数であることに注意してください。現在の議論ではそれはそれほど重要ではないと思いますが、知っておくことが重要です。
次に、fun()
でpostincrement演算子を使用します。つまり、式の結果は値ですbeforei
がインクリメントされます。 i
の最終値11は単に破棄され、関数は10を返します。異なる変数であるmainに戻る変数i
には値10が割り当てられます。 9。
実際に起こることは、接尾辞i.e. i ++を使用する場合です。iの初期値は、インクリメントされた値ではなく、戻り値として使用されます。この後、iの値は1増加します。これは、i ++を使用するすべてのステートメントで発生します。つまり、iの最初の初期値が式で使用され、その後増分されます。
そして、正反対にプレフィックスで発生します。 ++ iを返した場合、インクリメントされた値、つまり11が返されます。これは、最初に1を追加してから返されるためです。
説明:
ステップ1:int fun(int);
ここで、関数fun()
のプロトタイプを宣言します。
ステップ2:int i = fun(10);
変数iは整数型として宣言され、fun(10)
の結果は変数i
に格納されます。
ステップ3:int fun(int i){ return (i++); }
fun()
内では、値return(i++)
を返します。 _10
_を返します。 _i++
_はポストインクリメント演算子であるためです。
ステップ4:その後、コントロールはメイン関数に戻り、値_10
_が変数i
に割り当てられます。
ステップ5:printf("%d\n", --i);
ここで_--i
_は事前インクリメントを示します。したがって、値_9
_を出力します。
fun(10)は10を返します。11を返すようにするには、i ++ではなく++ iを使用する必要があります。
int fun(int i)
{
return ++i;
}