2016-12-25 6 views
11

私は単純なコンソールアプリケーションでポストインクリメント演算子をテストしていますが、私は完全なコンセプトを理解していないことに気付きました。それは私には不思議そうです:C#ポストインクリメント

int i = 0; 
bool b = i++ == i; 
Console.WriteLine(b); 

出力が偽です。私はそれが本当だと思った。 2行目のAFAIKはポストインクリメントのため、コンパイラは比較を行い、1をインクリメントした後にbをtrueに割り当てます。しかし明らかに私は間違っています。その後 は、私はそのようなコードを変更:

int i = 0; 
bool b = i == i++; 
Console.WriteLine(b); 

出力が真となっている。この時間を。最初のサンプルから何が変わったのですか?

答えて

9

たとえば、iの値が最初は0であるとします。

i++ == iは、i0)を読み出しiをインクリメントし、(1)再度iを読み出し、2つの値を比較する:0 == 1

i == i++は、i0)を読み出し、再び(0)をiを読み出し、iをインクリメントし、2つの値を比較:0 == 0

古い値を読み取った後、インクリメントはすぐにになります。コードのあなたの最初のスニペットに答える

1

:ここ

bool b = i++ == i;0 == 1であり、あなたがi++は、ポストインクリメントである知っているようにii++0ままですが、その部分の後に実行を終了し、それがされているため、これはあります右手側であるiと比較して、この時点では、前回のポストインクリメントのために値が1に変化する。これは、bool b = i++ == i;のときにFalseを取得する理由です。

Like @hvd said:この値は、古い値を読み込んだ直後に発生します。

+0

「bool b = i == i ++;」つまり0 == 0が真となり、その後増分が発生します。最初は値を比較してからiをインクリメントしますが、最初は 'bool b = i ++ == i;' 0 == 1のように他の方法で起こっています。最初に0を読み込み、次にiをインクリメントしてから比較します時間iは1に増分されるため、彼は間違っています。 – Aamerallous

+0

それは正しいです。最初の部分の背後にあるコンセプトを理解すれば、2番目のコードスニペットは理解できます。これはほとんどのプログラミング言語で同じです。基本的な基本概念です。 – Inconnu

1

接尾辞と等価演算子の評価の順番は左から右です。コードはコードコメントで説明したように動作します。

int i = 0; 
bool b = i++ == i; 
// 1.) i++ returns old value i.e. 0 
// 2.) but after that it increments and becomes 1 
// 3.) hence, bool b = 0 == 1; --> evaluates to false 
Console.WriteLine(b); // prints false 

int i = 0; 
bool b = i == i++; 
// 1.) i returns old value i.e. 0 
// 2.) i++ returns old value i.e. 0, as this is the end of the statement after that it would increment 
// 3.) hence, bool b = 0 == 0; --> evaluates to true 
Console.WriteLine(b); // prints true 
関連する問題