2017-01-25 5 views
30

Wenn Sie versuchen, etwas zu tun:Warum funktioniert (boolean^int> 0)?

if (true^1) { 
    //do something 
} 

der Compiler sagt vernünftig, dass Betreiber ^ nicht für Argumenttypen boolean und int definiert ist. Aber wenn Sie es wie folgt verwenden:

if (true^1 > 0) { 
    //do something 
} 

den Code kompiliert (für Java 8 zumindest) und einwandfrei funktioniert. Grundsätzlich diese Operationen:

false^-1 > 0 
false^1 > 0 
true^-1 > 0 
true^1 > 0 

Act wie eine gültige logische XOR:

 |^
-----+-- 
F F | F 
F T | T 
T F | T 
T T | F 

Könnte jemand bitte erklären, was unter der Haube passiert?

+32

XORed Ich empfehle Sie lernen über [* Operator Vorrang *] (http://introcs.cs.princeton.edu/java/11precedence/). –

+5

@Someprogrammerdude Um fair zu sein, ist die Tatsache, dass bitweise Operatoren eine niedrigere Priorität als Vergleiche haben, ein besonders unspektakulärer Aspekt der Operatorpräzedenz von Sprachen, wo dies der Fall ist. – Random832

+5

Das ist, warum Sie lernen müssen, @random :-) –

Antwort

78

Es ist ganz einfach: > hat eine höhere precedence als ^, so

if (true^1 > 0) { 

entspricht

if (true^(1 > 0)) { 

, die

entspricht
if (true^true) 

... was nur logisch ist, XOR.

Ich würde nie schreiben Code so, wohlgemerkt. Ich wäre überrascht, ein Beispiel zu sehen, das auf andere Weise nicht deutlicher geschrieben werden könnte.

+3

Ich bekam nie, warum Sicherheit orientierte Sprachen wie Java und C# sogar solchen Code erlauben, anstatt Klammern für die Übersichtlichkeit zu benötigen. Schließlich gibt es keine Regel, dass die Vorrangstellung des Operators eine Gesamtbestellung sein muss. – CodesInChaos

+2

@CodesInChaos: Well-Vorgänger + Assoziativität machen das Verhalten für jeden Ausdruck gut definiert. Ich bin mir nicht sicher, ob Sie das mit "Total Order" meinen ... –

+3

@CodesInChaos Ich denke, die Antwort ist, dass die "Sicherheit" orientiert und nicht "Klarheit" orientiert ist. Diese sind verwandt, aber verschieden. Sicherheit erfordert, dass es keine Mehrdeutigkeit gibt und dies ist eindeutig. Die Idee einer klarheitsorientierten Sprache ist jedoch interessant. Ich habe nie mit etwas gearbeitet, das die Syntax _purely_ einschränkte, weil es vielleicht schwer zu verstehen ist. Es ist irgendwie merkwürdig, da Klarheit weithin als ein grundlegender Aspekt einer guten Entwicklung angesehen wird. – JimmyJames

10

1 ist vom Typ int.

1> 0 ist vom Typ boolean.

^bedeutet XOR; und Sie können nicht XOR Boolean und Int.

Mit anderen Worten: der erste Ausdruck "1" ergibt eine Zahl; der zweite Ausdruck "1> 0" ergibt eine boolesche Logik. Der Grund dafür ist der Operator predecence.

11

Da Betrieb > hat höhere Priorität als ^, so ist es gleichbedeutend mit true^(1>0), die mit gleichen Typen (boolean^boolean) arbeiten.

+0

[Es ist "als", nicht "dann"] (http://www.wikihow.com/Use-Than-and-Then) (in diesem Zusammenhang). –

3

Da Reihenfolge (Priorität) die Operationen von Bedeutung ist, hat > höhere Priorität als ^

Hier zunächst prüfen wir 1 > 0 und dann die erste Operation XOR-verknüpft (^) mit dem ersten Ergebnis

entsprechen if(true^(1 > 0))

Aber natürlich können Sie nicht Boolesche mit Int