2010-01-31 4 views
6

Nur eine kurze Fragegebräuchlicher Begriff für den „wertorientierte“ OR-Operator

printf("%d", 99 || 44) prints "1" in C 
print 99 || 44 prints "99" in perl 

Es gibt zwei verschiedene Arten der Bewertung. Hat jeder einen Namen?

edit: ich bin interessiert zu wissen, wie diese Perl-Bewertung im Vergleich zu C allgemein aufgerufen wird. Wenn Sie sagen "C Beispiel ist X, und Perl Beispiel ist nicht X, aber Y" welche Wörter würden Sie für X verwenden und Y. "Kurzschluss" ist nicht was ich suche.

+2

Ein gebräuchlicher Begriff für zwei Operationen, die unterschiedliche Auswirkungen haben? Ist das nicht die Frage, ob es einen gebräuchlichen Begriff für Äpfel und Orangen gibt? Scheint ein bisschen widersprüchlich. – jalf

+2

@Jalf: Er fragt nach einem gemeinsamen Begriff für diese beiden Arten von ** Bewertung ** _, sollte nicht die Antwort "Kurzschluss Bewertung" sein? –

+1

Ich bin mir nicht sicher. Ist die Kurzschlussbewertung das Merkmal, an dem er interessiert ist? Es könnte genauso gut "logisch oder" oder "Int-zu-Bool-Konvertierung" sein. Die beiden Codezeilen haben viel gemeinsam, aber es gibt auch einige wichtige Unterschiede. Ich bin nicht wirklich sicher, was das OP eine allgemeine Bezeichnung * für * – jalf

Antwort

6

Die C-Version verwendet || als logisches ODER zwischen den beiden Werten. Beide 44 und 99 bewerten, um true in C, da sie nicht 0 sind, so das Ergebnis einer ODER-Verknüpfung zwischen ihnen liefert 1 (AKA true in C)

In diesem bestimmten perl-Schnipsel, || ist die null-coalescing operator, eine Binärdatei, die das zweite Argument auswertet, wenn die erste Null ist, andernfalls wird das erste Argument ausgewertet. Da 99 das erste Argument und nicht null ist, wird es zurückgegeben und gedruckt.

EDIT: Danke Evan für die clafication: Die || Operator in Perl ist nicht der nullverschmelzende Operator, er gibt die RHS zurück, wenn die LHS als falsch bewertet wird, andernfalls wird die LHS zurückgegeben. // ist der "richtige" Nullkoaleszenzoperator.

Hier ist die Liste der Werte in Perl, die auf false (from wikipedia)

$false = 0; # the number zero 
$false = 0.0; # the number zero as a float 
$false = 0b0; # the number zero in binary 
$false = 0x0; # the number zero in hexadecimal 
$false = '0'; # the string zero 
$false = ""; # the empty string 
$false = undef; # the return value from undef 
$false = 2-3+1 # computes to 0 which is converted to "0" so it is false 
+4

re: * In diesem bestimmten Perl-Snippet, || ist der Nullkoaleszenzoperator, ein Binary, das das zweite Argument auswertet, wenn das erste null ist * - Es ist ganz sicher ** NOT ** Nullkoaleszieren. Ja, 'undef || stirb stirbt, aber auch '0 || sterben. '||' wertet das LHS aus und wenn es falsch zurückgibt, wertet es das RHS aus. undef einfach so, um zu fälschen (Gott sei Dank). Umgekehrt ist '//' der Nullkoaleszenzoperator, der in 5.10 eingeführt wurde, der * nur * die RHS auslöst, wenn LHS null ist, vorher können Sie '(definiert $ a) || sterben' –

+1

* Die || Der Operator in Perl ist nicht der nullverschmelzende Operator, er gibt den LHS zurück, wenn der erste Wert falsch ist, andernfalls das erste Argument. * Wie alle Anweisungen in Perl gibt er seinen letzten ausgewerteten Ausdruck zurück, der immer das letzte Argument ist '||'. Schauen Sie sich dieses 'perl -e'print 0 ||" 0 "|| undef' an, um zu sehen. –

3

In Perl 99 || 44 gibt 99 zurück, weil || "short circuitisting" ist und wenn das erste Argument im booleschen Kontext wahr ist, gibt es es nur zurück. print druckt 99.

In C das Ergebnis || logisch ist, die zu printf Ergebnissen bestanden entweder in 1 oder 0 Es ist auch ein Kurzschluss, so wird 44 nicht einmal ausgewertet.

+7

C's || schließt auch kurz. Es wird nur 1 oder 0 ausgewertet. –

+0

@Roger: sicher, danke. redigiert es, um es klarer zu machen –

8

Gelesen here.

Binär || führt einen Kurzschluss logische ODER-Operation. Das heißt, wenn der linke Operand wahr ist, wird der rechte Operand nicht einmal ausgewertet. Skalar- oder Listenkontext wird bei Auswertung zum rechten Operanden weitergeleitet.

In Perl die || und & & Operatoren unterscheiden sich von C darin, dass sie, anstatt 0 oder 1 zurückzugeben, den letzten ausgewerteten Wert zurückgeben.


printf ("% d", 99 || 44) druckt "1" in C

Dies, weil 99||44 true zurück (nur 99 (die nicht Null ist) wird aufgrund der Kurzschlußwirkung von ||) bewertet, deren Äquivalent 1 ist, daher printf() Drucke 1.

drucken 99 || 44 druckt "99" in Perl

..rather als Rückkehr 0 oder 1, den letzten Wertes ausgewertet (99 hier) zurückgegeben.

+0

@steeofrog: Ihre Frage war _ist dort ein ** allgemeiner Ausdruck ** für diese zwei Arten der Auswertung? _. Meine Antwort ist Kurzschluss-Auswertung. Beantwortet es deine Frage nicht? BTW wer auch immer downvoted, bitte erklären Sie den Grund? –

+1

stereofrog: Schau nochmal, antwortete er, der Unterschied ist ein Implementierungsdetail. C gibt 1 für "True" zurück, während Perl den letzten Wert ungleich Null zurückgibt, der für "True" ausgewertet wird. –

1

Sowohl C und Perl beziehen sich auf ihre jeweiligen || Operatoren als „logischen OR“ (im Unterschied zu einem bitweise auswerten OR) . Es gibt keinen speziellen Namen für Perl das Verhalten von den letzten Wert auf 0 oder 1

9

wie Sie beachten, die Worte für suchen Sie nicht „Kurzschluss“. Kurzschlussauswertung bedeutet, dass im Gegensatz Rückkehr im Ausdruck

Wenn Ausdruck e1 zu etwas ausgewertet wird, das die Wahrheit darstellt, ist es nicht notwendig, e2 auszuwerten. Sowohl C als auch Perl verwenden eine Kurzschlussauswertung.

Ich bin mir bewusst, die Unterscheidung Du in zwei verschiedenen Varianten von Kurzschluss machen OR, aber in zwanzig Jahren in Programmiersprachen arbeitet Ich habe noch nie diese Dinge genannt gesehen. Die Perl-Version ist in dynamischen Sprachen sehr beliebt, z. B. Icon, Lua, Scheme.

Die Perl-Version ist fast ausdrückbar in C:

e1 ? e1 : e2 

Leider kann diese Version e1 zweimal bewerten, je nach dem Optimierungs — und wenn e1 Nebenwirkungen hat, oder wenn der Compiler kann nicht sagen, Wenn es könnte Nebenwirkungen haben, dann ist der Compiler erforderlich, um es zweimal ausgewertet. Dieser Fehler kann behoben werden, indem der Wert e1 an eine neue lokale Variable gebunden wird, aber dafür eine GNU-Erweiterung benötigt wird.

Das C Verhalten kann in Perl durch

!!(e1 || e2) 
0

In C emuliert werden, ist || ein Boolesche Operation. In Perl ist es ein Integer Typ-agnostische Operation die passiert, um das erste Argument als booleschen Wert zu behandeln. Das ist der einzige Unterschied.

+0

Sicher, dass es eine Integer-Operation in Perl ist? Was ist mit '$ s =" Hallo "|| ""? – Frunsi

+0

@frunsi: Lol, ich kenne Perls Terminologie nicht. – Potatoswatter

Verwandte Themen