2010-07-19 28 views
7

EsLa precedencia de operadores en C#

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

equivalente a

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

... y tendrá que utilizar el punto flotante o división entera?

Editar ... si la respuesta es afirmativa a lo anterior, ¿cuál es la ventaja de realizar una división de punto flotante aquí?

Respuesta

12

/ y * tienen la misma precedencia de operador, en §7.2.1 por lo que los dos resultados deben ser los mismos (utilizando las reglas float).

Yo, sin embargo, no puedo molestarme en aprender las tablas de precedencia; Solo uso paréntesis. Entonces funciona en cualquier idioma sin necesidad de recordarlo.

Otra pregunta importante es el redondeo en el reparto final (int): ¿espera que esté "arriba", "abajo" o "banqueros"?

+1

+1 solución a prueba de tontos en cualquier idioma – cjk

+0

Buena respuesta al redondeo: lamentablemente no conozco el resultado esperado. ¿Alguna idea de por qué el implementador utilizaría la división de coma flotante en lugar de la división de enteros, evitando el reparto? – Ben

+1

@Ben; imagina que el conteo es 3. '1/3' (usando un entero) es' 0'; '0 * 100' es' 0', que no es la respuesta deseada. '1/(float) 3' es' 0.33', etc., dando '33' después de la multiplicación y el lanzamiento - ¿Supongo que es un%? En realidad, hubiera usado 'decimal'. –

2

Son equivalentes y utilizará la división de punto flotante. Incluso si la multiplicación sucediera primero, se usaría la división de coma flotante ya que el int se divide por el resultado de float * int que es flotante.

Editar:

Si la respuesta es sí a todo lo anterior, ¿cuál es la ventaja de realizar una división en coma flotante aquí?

¿Es una ventaja? Lo primero que debe considerar es si es correcto o no, ya que el resultado será diferente. A juzgar por el código, parece que estás tratando de calcular algún porcentaje. Al usar divisiones enteras, si "int1" siempre es más pequeño que var2.Count() el resultado siempre será 0, que podría no ser el que usted desea.

0

Es lo mismo. Ambos usarán la división flotante.

1

Yo diría que sí, la división y la multiplicación deberían ir de izquierda a derecha. Y así es una división de flotación.

PD: reemplace float con double donde sea que pueda.

0

sí ambos son equivalentes.

Ambos usarán la división de punto flotante.

división
0

enteros sólo dará vuelta a toda la parte de la respuesta es decir, 3/2 será 1, mientras que la división de flotación le dará 1,5

3

Precedencia reglas son muy molesto para recordar, por lo que yo también prefiero usar soportes de desambiguar Intento seguir el consejo de "escribir código para personas primero, computadoras en segundo lugar". Sin embargo, hay una regla mnemotécnica interesante (que he aprendido de los libros de Bruce Eckel) para recordar (algunas de) las reglas: "Úlcera adictos realmente como CA montón":

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

No es se apretó, operadores de bits perfectos y tenemos que saber que los operadores de multiplicación (*, /,%) tienen prioridad sobre los de suma (+, -).

+1

Y los lanzamientos son expresiones unarias. – kristianp

Cuestiones relacionadas