2012-03-29 35 views
7

Czy różnice poniżej znaczenia istotnie w C#?Pierwszeństwo operacji Cast w języku C#

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

Którą używasz?

+0

Upewnij się, że NIE używasz 'result = (double) (a/b);' –

+0

Żadne z nich nie jest nawet wymagane. 'a' i' b' są już podwójne. zmienna wyniku jest podwójna. Jedyne, co nie będzie podwójne, to wynik podziału na dwa duble. Jeśli się nie mylę, w takim przypadku występuje naturalne odlewanie z liczby całkowitej do doule. –

+1

@Ramhound 'a' i' b' są liczbami całkowitymi, nie podwójnymi. Wykonanie 'result = a/b' spowoduje podział liczb całkowitych, a następnie rzutowanie na podwójne. – Msonic

Odpowiedz

10

Odlewanie nastąpi przed podziałem.

W Twoich przykładach nie ma znaczenia, który z nich wykonujesz tak, jakby jeden operand był podwójny, środowisko wykonawcze rzuci/konwertuje także drugi element.

To wygląda na mikrooptymalizację - nie jest czymś, o co warto się martwić, chyba że pomiary wykażą, że jest to wąskie gardło.

+0

Moim głównym zmartwieniem jest precyzja na końcu obliczeń. Bałem się, że ten, który wybiorę do rzucenia (pierwszy, jawnie), robi różnicę. Ale ponieważ mówisz, że internals rzuca każdego z nich, ufam ci. – Jake

+0

@Jake - zaufaj, ale zweryfikuj ... To jest coś, co możesz samodzielnie testować (wystarczy napisać małą aplikację, która wykonuje różne typy obliczeń). – Oded

+1

W rzeczywistości mała aplikacja niczego nie udowodni. Mały podzestaw argumentów testowych nie może reprezentować wyniku dla wszystkich możliwych argumentów operacji, chyba że zostanie po raz pierwszy określony, że jest zaimplementowany jako taki. Dlatego musiałem zadać to pytanie. – Jake

2

zrobić to:

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

Może być ściśle niepotrzebne, ale generalnie chcę zrobić pewny że nie zrobi podział liczby całkowitej, a ja naprawdę nie obchodzi, aby pamiętać, szczególne zasady dla tego scenariusza, więc łatwiej jest (jeśli kilka kolejnych naciśnięć klawiszy) jawnie.

+0

Właściwie robię to *, ponieważ * nie zawracam sobie głowy zapamiętywaniem szczegółów. Ale postanowiłem zmienić moje leniwy nawyk, dlatego zadałem to pytanie. (przy okazji, nie dałem ci -1) – Jake

+0

@Jake dobrze dla ciebie, próbując ograniczyć leniwy nawyk! :) –

0

Robię (double)a/b ponieważ wyobrażam sobie int, aby być czymś niepodzielnym jak skała czy coś. Po rzuceniu do podwójnego staje się podzielny, jak ciasto. Możesz podzielić 3.0 ciasta na cztery części, ale nie możesz podzielić trzech kamieni na 4,0 części. Lub coś. Czy masz jakiś sens?