2010-07-19 16 views
7

IstOperator Vorrang in C#

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

entspricht

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

... und wird es Gleitkomma oder Integer-Division verwenden?

Edit ... Wenn die Antwort ja ist, was ist der Vorteil einer Gleitkommadivision hier?

Antwort

12

/ und * haben den gleichen Operator Vorrang, unter §7.2.1 so die beiden Ergebnisse sollten die gleichen sein (mit float Regeln).

Ich kann jedoch nicht gestört werden, um Vorrang-Tabellen zu lernen; Ich benutze nur Klammern. Dann funktioniert es in jeder Sprache, ohne sich daran erinnern zu müssen.

Eine weitere wichtige Frage ist die Rundung in der endgültigen (int) Besetzung: Erwarten Sie, dass es "oben", "unten" oder "Banker" ist?

+1

+1 für narrensichere Lösung in jeder Sprache – cjk

+0

Gute Frage zum Runden - leider weiß ich nicht das gewünschte Ergebnis. Irgendeine Idee wieso würde der Implementator eine Gleitkommadivision anstelle einer Ganzzahldivision verwenden, um die Besetzung zu vermeiden? – Ben

+1

@Ben; Stellen Sie sich vor, die Zählung ist 3. '1/3' (mit Ganzzahl) ist" 0 "; "0 * 100" ist "0", was nicht die beabsichtigte Antwort ist. '1/(float) 3 'ist' 0.33' usw., was '33' nach Multiplikation und Cast ergibt - ich nehme an, das ist ein%? Eigentlich hätte ich 'dezimal' verwendet. –

2

Sie sind äquivalent und es wird Gleitkomma Division verwendet. Selbst wenn die Multiplikation zuerst stattfinden würde, würde eine Gleitkommadivision verwendet werden, da der Int durch das Ergebnis von float * int dividiert wird, was float ist.

Edit:

Wenn die Antwort ja auf die oben ist, was ist der Vorteil hier eine Gleitkomma-Division durchführen?

Ist es ein Vorteil? Das erste, was Sie in Betracht ziehen sollten, ist, ob es korrekt ist oder nicht, da das Ergebnis anders sein wird. Gemessen am Code scheint es, dass Sie versuchen, einen Prozentsatz zu berechnen. Wenn "int1" immer kleiner als var2.Count() ist, wird bei der Verwendung von Integer-Divison immer 0 zurückgegeben, was möglicherweise nicht das ist, was Sie wollen.

0

Es ist das gleiche. Beide werden Float Division verwenden.

1

Ich würde sagen, Ja, Division und Multiplikation sollten von links nach rechts gehen. Und so ist es eine Float-Division.

PS: ersetzen float durch double wo immer Sie können.

0

ja beide sind gleichwertig.

Beide verwenden Gleitkommadivision.

0

Integer-Division wird nur das ganze Teil der Antwort, dh 3/2 zurück geben wird 1 sein, während float Division Es wird nur 1,5

3

Präzedenz Regeln wirklich ärgerlich sind zu erinnern, so dass ich bevorzugen Klammern zu verwenden, um disambiguate. Ich versuche, dem Ratschlag zu folgen, Code für Leute zuerst zu schreiben, Computer zweitens. Aber gibt es eine interessante mnemonic (die ich von Bruce Eckel Büchern gelernt) zu erinnern (zum Teil) die Regeln: „Ulcer Addicts wirklich wie CA Los“:

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

Es ist nicht perfekt, Bitoperatoren gequetscht in und wir müssen wissen, dass die Multiplikationsoperatoren (*, /,%) Vorrang vor den zusätzlichen (+, -) haben.

+1

Und Umwandlungen sind unäre Ausdrücke. – kristianp

Verwandte Themen