Приоритет оператора в C#

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

эквивалентный

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

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

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

7
задан Ben 19 July 2010 в 09:59
поделиться

7 ответов

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

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

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

12
ответ дан 6 December 2019 в 09:57
поделиться

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

Редактировать:

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

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

2
ответ дан 6 December 2019 в 09:57
поделиться

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

0
ответ дан 6 December 2019 в 09:57
поделиться

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

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

0
ответ дан 6 December 2019 в 09:57
поделиться

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

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

1
ответ дан 6 December 2019 в 09:57
поделиться

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

0
ответ дан 6 December 2019 в 09:57
поделиться

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

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

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

3
ответ дан 6 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: