2012-03-29 20 views
7

Le differenze sottostanti sono significative in C#?Precedenza dell'operazione di trasmissione in C#

int a, b; 
double result; 
result = (double)a/b; 
result = a/(double)b; 
result = (double)a/(double)b; 

Quale usi?

+0

Assicurati di NON utilizzare 'result = (double) (a/b);' –

+0

Nessuno di questi è nemmeno richiesto. 'a' e' b' sono già doppi. la variabile risultato è un doppio. L'unica cosa che non sarà un doppio è il risultato della divisione di due doppi. Se non sbaglio c'è un casting naturale da un intero a doule in un caso come questo. –

+1

@Ramhound 'a' e' b' sono numeri interi, non doppi. Fare 'result = a/b' comporterà una divisione intera, quindi un cast in double. – Msonic

risposta

10

Il lancio avverrà prima della divisione.

Nei tuoi esempi, non importa quale si faccia come se un operando fosse un doppio, il runtime eseguirà il cast/convertirà anche l'altro in doppio.

Sembra una micro-ottimizzazione, non qualcosa che vale la pena di preoccuparsi o trattare a meno che le misurazioni non dimostrino che è davvero un collo di bottiglia.

+0

La mia preoccupazione principale è la precisione alla fine del calcolo. Avevo paura che qualunque persona scelsi di lanciare (in primo luogo, esplicitamente) fa la differenza. Ma dal momento che tu dici che gli interni getteranno ognuno di loro, mi fiderò di te. – Jake

+0

@Jake: fidati, ma verifica ... Questo è qualcosa che puoi testare facilmente da solo (basta scrivere una piccola applicazione che faccia i diversi tipi di calcoli). – Oded

+1

In realtà, la piccola applicazione non dimostrerà nulla. Un piccolo sottoinsieme di operandi di test non può rappresentare il risultato per tutti i possibili operandi, a meno che non sia determinato per primo che sia implementato come tale. Quindi ho dovuto fare questa domanda. – Jake

2

faccio questo:

result = (double)a/(double)b; 

Può essere rigorosamente superfluo, ma in generale voglio fare assicurarsi che non farà divisione intera, e non ho veramente cura di ricordare le norme specifiche per questo scenario, quindi è più facile (se un paio di battiture in più) essere esplicito.

+0

In realtà sto facendo questo * perché * Non mi preoccupo di ricordare le specifiche. Ma decido di cambiare le mie abitudini pigre, quindi ho fatto questa domanda. (btw, non ti ho dato il -1) – Jake

+0

@Gioca bene, cercando di frenare le abitudini pigre! :) –

0

Io faccio (double)a/b perché immagino che un int sia qualcosa di indivisibile come una roccia o qualcosa del genere. Quando viene lanciato su un doppio diventa divisibile, come una torta. Puoi dividere 3,0 torte in quattro parti, ma non puoi dividere tre rocce in 4.0 parti. O qualcosa. Ha senso?