Принцип БОДМАС в .NET - PullRequest
       0

Принцип БОДМАС в .NET

5 голосов
/ 20 января 2012

Сегодня я обнаружил, что .NET Framework следует порядку операций BODMAS при выполнении вычислений. То есть расчеты выполняются в следующем порядке:

  • Кронштейны
  • Заказы
  • Отдел
  • Умножение
  • Добавление
  • Вычитание

Однако я искал и не смог найти никакой документации, подтверждающей, что .NET определенно следует этому принципу, есть ли такие документы где-нибудь? Я был бы признателен, если бы вы указали мне правильное направление.

Ответы [ 3 ]

23 голосов
/ 20 января 2012

Обратите внимание, что 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/

1 голос
/ 20 января 2012

http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx детализирует все приоритеты и не совсем соответствует вашему списку.

1 голос
/ 20 января 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...