2010-11-27 17 views

答えて

7

C#はこれを左から右に評価します。 C++ではsequence pointを介さずに変数を変更して再度読み込むので、funny expressionsundefined behaviorを呼び出します。

これは、(a++)+(++a)+(a--)+(--a)に対して異なるコンパイラ(または異なる最適化設定の同じコンパイラ)が許可されていることを意味します(通常)。

0

C++の完全なリストについては、hereをご覧ください。 FredOverflowが言うように、C#は右

+2

を生成:) – fredoverflow

+0

先端ため:-P感謝を編集しました。 – Bojangles

4

左から評価される式は、C#のC#(左から右への評価)

で明確に定義された挙動を有し、出力は24(不23)であろう

int b = (a++)+(++a)+(a--)+(--a); 

     // 5 + 7 + 7 + 5 = 24 

C++の場合、aが2つのsequence pointsの間で2回以上変更されているため、この式ではUndefined Behaviourが呼び出されます。

+0

@FredOverflow:編集していただきありがとうございます。私はもっ​​とコーヒーが必要です '): –

+0

あなたは大歓迎です。 – fredoverflow

0

とにかくこれを見るために必要なので、私はここでもそれを掲示すると思った。以下の規則は、式のこれらの種類に適用される埋め込み式

有する式のC#5.0仕様

5.3.3.21一般規則から

:括弧式(§7.6.3) (7.6.6)、索引付き基本アクセス式(7.6.8)、インクリメントおよびデクリメント式(7.6.9,7.7.5)、キャスト式(7.7.6)、単項+ - 、〜、*式、バイナリ+、 - 、*、/、%、< <、>>、<、< = |、=、==、==、!=、は、&、|、^式(§7.8、§7.9、§7.10、§7.11)、複合代入式(§7.17.2)、チェックされた式とチェックされていない式§7.6.12)、配列とデリゲート作成式(7.6.10)。

これらの式のそれぞれには、無条件でが固定順序(強調マイニング)で評価される1つ以上のサブ式があります。たとえば、バイナリ%演算子は演算子の左辺を評価し、次に右辺を評価します。索引付け操作では、索引付けされた式が評価され、各索引式が左から順に評価されます。

各種類の式の詳細なルールはセクション7にあります。これらはすべてここにはリストされませんが、ヒューリスティックはコードのように左から右の順です。例えば。引数リストの

7.5.1.2ランタイム評価引数リストの

式は常にそれらが書かれている順に評価されています。したがって、例えば

class Test 
{ 
    static void F(int x, int y = -1, int z = -2) { 
      System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); 
    } 
    static void Main() { 
      int i = 0; 
      F(i++, i++, i++); 
      F(z: i++, x: i++); 
    } 
} 

は、私は構文が回答を越えて働く `` @とは思わない出力

x = 0, y = 1, z = 2 
x = 4, y = -1, z = 3 
関連する問題