Обратите внимание, что C # не соответствует правилу BODMAS, как вы учились в школе. Предположим, у вас есть:
A().x = B() + C() * D();
Вы можете наивно думать, что умножение «выполняется сначала», затем добавление, а затем присваивание, и, следовательно, это эквивалентно:
c = C();
d = D();
product = c * d;
b = B();
sum = b + product;
a = A();
a.x = sum;
Но это не то, что происходит. Правило BODMAS требует только, чтобы операции выполнялись в правильном порядке; операнды могут быть вычислены в любом порядке.
В C # операнды вычисляются слева направо . Так что в этом случае то, что произошло бы, логически так же, как:
a = A();
b = B();
c = C();
d = D();
product = c * d;
sum = b + product;
a.x = sum;
Кроме того, C # не выполняет каждое умножение перед каждым сложением. Например:
A().x = B() + C() + D() * E();
вычисляется как:
a = A();
b = B();
c = C();
sum1 = b + c;
d = D();
e = E();
product = d * e;
sum2 = sum1 + product;
a.x = sum2;
Видите, самое левое сложение происходит перед умножением; умножение должно произойти только до самого правого 1031 * сложения.
По сути, правило гласит: «Заключите выражение в скобки правильно, чтобы у вас были только двоичные операторы, а затем вычислите левую часть каждого двоичного оператора перед правой». Итак, наш пример будет:
A().x = ( ( B() + C() ) + ( D() * E() ) );
и теперь понятно. Крайнее левое сложение - это операнд к крайнему правому сложению, и поэтому самое левое сложение должно выполняться перед умножением, поскольку левый операнд всегда выполняется перед правым операндом.
Если вас заинтересовал этот предмет, посмотрите мои статьи на нем:
http://blogs.msdn.com/b/ericlippert/archive/tags/precedence/