web-dev-qa-db-ja.com

前置演算子と後置演算子の違いは何ですか?

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

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

int fun (int i)
{
    return(i++);
}
31
pradeep

++の接尾辞と接頭辞のバージョンにはbigの違いがあります。

プレフィックスバージョン(つまり、++i)では、iの値がインクリメントされ、式の値はnewの値iです。

後置バージョン(つまり、i++)では、iの値は増加しますが、式の値はiの値です。

次のコードを行ごとに分析してみましょう。

int i = 10;   // (1)
int j = ++i;  // (2)
int k = i++;  // (3)
  1. i10(簡単)に設定されます。
  2. この行の2つのこと:
    • i11にインクリメントされます。
    • newiの値がjにコピーされます。したがって、j11と等しくなります。
  3. この行には次の2つのこともあります。
    • i12にインクリメントされます。
    • 元のiの値(11)はkにコピーされます。したがって、k11と等しくなります。

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

--の接尾辞と接頭辞のバージョンにも同じことが当てはまります。

54

プレフィックス:

int a=0;

int b=++a;          // b=1,a=1 

割り当ての前に値が増加します。

後置:

int a=0;
int b=a++;  // a=1,b=0 

最初に「a」の値を「b」に割り当て、次に「a」の値を増分します

12
Dilu Thankachan

関数は、修正後演算子(++)を使用しているため、iがインクリメントされる前に戻ります。いずれにしても、iの増分はグローバルではなく、それぞれの関数に対してのみです。プレフィックス演算子を使用した場合、11そして、10

したがって、iを10として返し、printf関数でデクリメントして、9 not 10 あなたが考えるように。

10
user195488

実際、return (i++)は10のみを返します。

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

return i;
i + 1;

したがって、10を返し、それを増分しません。

7
loganfsmyth

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

プレフィックスのデクリメントは、オペランドの値を増やしますbefore評価されました。 _--i_の値は_i - 1_です。

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

したがって、あなたの場合、fun(10)は10を返し、_--i_を出力すると_i - 1_(9)が出力されます。

4
Rafe Kettler

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

3
Alok Save

違いを示す2つの例があります

int a , b , c = 0 ; 
a = ++c ; 
b = c++ ;
printf (" %d %d %d " , a , b , c++);
  • ここで、cの値は0 cで1ずつ増加し、値1を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を出力します
3

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

2
Kevin

最初に、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を追加してから返されるためです。

2
Gargee Sanyal

説明:

ステップ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_を出力します。

2

fun(10)は10を返します。11を返すようにするには、i ++ではなく++ iを使用する必要があります。

int fun(int i)
{
    return ++i;
}
1
mbreining