Приоритет оператора в C # - PullRequest
7 голосов
/ 19 июля 2010

Есть

(int)(int1 / (float)var2.Count() * 100)

эквивалентно

(int)((int1 / (float)var2.Count()) * 100)

... и будет ли он использовать деление с плавающей запятой или целочисленное деление?

Редактировать ... если ответ "да" на вышеприведенный вопрос, в чем здесь преимущество деления с плавающей запятой?

Ответы [ 8 ]

12 голосов
/ 19 июля 2010

/ и * имеют одинаковый приоритет оператора, согласно §7.2.1, поэтому оба результата должны быть одинаковыми (с использованием float правил).

Я, однако, не могу потрудиться изучить таблицы приоритетов; Я просто использую скобки. Тогда он работает на любом языке без необходимости его запоминания.

Еще один важный вопрос - округление в финальном (int) броске: ожидаете ли вы, что это будет «вверх», «вниз» или «банкиры»?

3 голосов
/ 19 июля 2010

Правила прецедента действительно раздражают, поэтому я предпочитаю использовать скобки для устранения неоднозначности.Я стараюсь следовать совету «сначала пишите код для людей, а потом компьютеры».Но есть интересная мнемоника (которую я узнал из книг Брюса Экеля), чтобы помнить (некоторые из) правил: « Язвенные наркоманы действительно любят CA много »:

Ulcer   - Unary (+, -, ++, --, !)
Addicts - Arithmetic (and shift) (+, -, *, /, %, <<, >>)
Really  - Relational (<, >, ==, <=, >=, !=)
Like    - Logical (and bitwise) (&&, ||, &, |, ^)
C       - Conditional ( ? : ) <- this is the conditional ternary operator
A lot   - Assignment ( =, *=, +=, ...)

в нее втиснуты идеальные побитовые операторы, и мы должны знать, что операторы умножения (*, /,%) имеют приоритет над сложными (+, -).

2 голосов
/ 19 июля 2010

Они эквивалентны и будут использовать деление с плавающей запятой.Даже если умножение произойдет первым, будет использовано деление с плавающей запятой, так как int делится на результат с плавающей точкой * int, который является float.

Edit:

Еслиответ «да» на вышеизложенное, в чем преимущество выполнения деления с плавающей запятой здесь?

Это преимущество?Первое, что вы должны рассмотреть, является ли это правильным или нет, так как результат будет другим.Судя по коду, кажется, вы пытаетесь вычислить какой-то процент.При использовании целочисленного деления, если «int1» всегда меньше, чем var2.Count (), результатом всегда будет 0, что может быть не тем, что вы хотите.

1 голос
/ 31 октября 2011

См. Спецификацию языка C #: Приоритет оператора и ассоциативность .

1 голос
/ 19 июля 2010

Я бы сказал, Да, деление и умножение должны идти слева направо.И, таким образом, это деление с плавающей точкой.

PS: замените float на double везде, где можете.

0 голосов
/ 19 июля 2010

Целочисленное деление вернет только всю часть ответа, т.е. 3/2 будет 1, тогда как деление с плавающей запятой даст вам 1,5

0 голосов
/ 19 июля 2010

да, оба эквивалентны.

Оба будут использовать деление с плавающей запятой.

0 голосов
/ 19 июля 2010

То же самое.Оба будут использовать деление поплавка.

...