:C#とC++の評価の順番は?私はC#とC++で次のことを試してみました
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
私はC#とC++でのBの結果を得ることを試みました。 しかし、私は両方で異なる答えを得ました。
C#で23、C++で20が得られました。
だから、どうして私に答えてください?これの理由は何でしょうか?
:C#とC++の評価の順番は?私はC#とC++で次のことを試してみました
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
私はC#とC++でのBの結果を得ることを試みました。 しかし、私は両方で異なる答えを得ました。
C#で23、C++で20が得られました。
だから、どうして私に答えてください?これの理由は何でしょうか?
C#はこれを左から右に評価します。 C++ではsequence pointを介さずに変数を変更して再度読み込むので、funny expressionsはundefined behaviorを呼び出します。
これは、(a++)+(++a)+(a--)+(--a)
に対して異なるコンパイラ(または異なる最適化設定の同じコンパイラ)が許可されていることを意味します(通常)。
C++の完全なリストについては、hereをご覧ください。 FredOverflowが言うように、C#は右
左から評価される式は、C#のC#(左から右への評価)
で明確に定義された挙動を有し、出力は24(不23)であろう
int b = (a++)+(++a)+(a--)+(--a);
// 5 + 7 + 7 + 5 = 24
C++の場合、a
が2つのsequence pointsの間で2回以上変更されているため、この式ではUndefined Behaviourが呼び出されます。
@FredOverflow:編集していただきありがとうございます。私はもっとコーヒーが必要です '): –
あなたは大歓迎です。 – fredoverflow
とにかくこれを見るために必要なので、私はここでもそれを掲示すると思った。以下の規則は、式のこれらの種類に適用される埋め込み式
有する式の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
を生成:) – fredoverflow
先端ため:-P感謝を編集しました。 – Bojangles