2010-07-19 22 views
7

èprecedenza degli operatori in C#

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

equivalente a

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

... e se intende utilizzare in virgola mobile o la divisione intera?

Modifica ... se la risposta è sì a quanto sopra, qual è il vantaggio di eseguire una divisione in virgola mobile qui?

risposta

12

/ e * hanno la stessa priorità operatore, sotto §7.2.1 così i due risultati dovrebbero essere uguali (utilizzando float regole).

I, tuttavia, non può essere infastidito per apprendere le tabelle di precedenza; Uso solo parentesi. Quindi funziona in qualsiasi lingua senza bisogno di ricordarlo.

Un'altra domanda importante è l'arrotondamento nel cast finale (int): ci si aspetta che sia "su", "giù" o "banchieri"?

+1

+1 per soluzione a prova di errore in qualsiasi lingua – cjk

+0

Una buona domanda di arrotondamento - sfortunatamente non conosco il risultato desiderato. Qualche idea sul perché l'implementatore userebbe la divisione in virgola mobile anziché la divisione intera, evitando il cast? – Ben

+1

@ Ben; immagina che il conteggio sia 3. '1/3' (usando l'intero) è' 0'; '0 * 100' è' 0', che non è la risposta desiderata. '1/(float) 3' è' 0.33', etc, dando '33' dopo la moltiplicazione e il cast - presumo che sia un%? In realtà, avrei usato 'decimale'. –

2

Sono equivalenti e utilizzeranno la divisione in virgola mobile. Anche se la moltiplicazione fosse avvenuta per prima, sarebbe stata utilizzata la divisione in virgola mobile poiché l'int è diviso dal risultato di float * int che è float.

Edit:

Se la risposta è sì a quanto sopra, qual è il vantaggio di eseguire una divisione in virgola mobile qui?

È un vantaggio? La prima cosa che dovresti considerare è se sia corretto o meno, dato che il risultato sarà diverso. A giudicare dal codice sembra che tu stia cercando di calcolare una certa percentuale. Quando si utilizza la divisione intero, se "int1" è sempre minore di var2.Count() il risultato sarà sempre 0 che potrebbe non essere quello che si desidera.

0

È lo stesso. Entrambi useranno la divisione float.

1

Direi Sì, la divisione e la moltiplicazione devono andare da sinistra a destra. E quindi è una divisione float.

PS: sostituire float con double ovunque sia possibile.

0

sì entrambi equivalgono.

Entrambi utilizzeranno la divisione in virgola mobile.

divisione
0

Integer sarà solo restituire tutta la parte della risposta cioè 3/2 sarà 1, mentre la divisione galleggiante vi darà 1,5

3

Precedenza regole sono davvero fastidioso da ricordare, così anche io preferisco usare le parentesi per disambiguare. Provo a seguire il consiglio di "scrivere prima il codice per le persone, il secondo per i computer". Ma, c'è un mnemonico interessante (che ho imparato dai libri di Bruce Eckel) da ricordare (alcune) le regole: "Ulcera Addicts davvero come CA sacco":

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

Non è sono spremuto perfetti, operatori bit per bit e dobbiamo sapere che gli operatori di moltiplicazione (*, /,%) hanno la precedenza su quelli aggiuntivi (+, -).

+1

E i calchi sono espressioni unarie. – kristianp

Problemi correlati