Ist Kurzschluss logische Operatoren beauftragt? Und Bewertung um?
Nicht dem ANSI-standard Mandat das logische Operatoren, die kurzgeschlossen werden, entweder in C oder C++?
Ich bin verwirrt, denn ich erinnern an die K&R Buch, dass Ihr code sollte nicht hängen diese Vorgänge wird kurzgeschlossen, für Sie möglicherweise nicht. Könnte mir bitte jemand zeigen, wo in der Norm sagt, die Logik ops sind immer kurzgeschlossen? Ich bin hauptsächlich daran interessiert, auf C++, eine Antwort auch für C wäre toll.
Ich auch gelesen (kann mich nicht erinnern wo), dass die Bewertung Reihenfolge ist nicht streng definiert, so dass Ihr code sollte sich nicht darauf verlassen oder davon ausgehen, die Funktionen innerhalb eines Ausdrucks ausgeführt werden würde, die in einer bestimmten Reihenfolge: von das Ende einer Anweisung alle referenzierten Funktionen werden aufgerufen wurden, aber der compiler hat die Freiheit in der Auswahl der effizientesten Reihenfolge.
Nicht die standard-geben Sie die Bewertung, um dieser Ausdruck?
if( functionA() && functionB() && functionC() ) cout<<"Hello world";
Ich definierte diese Operatoren eine Weile her, als ich eine Klasse angelegt, die tun, einige grundlegende Boolesche algebra Operationen. Wahrscheinlich sollte der stick eine Warnung Kommentar "das zerstört Kurzschluss-und Links-rechts-Auswertung!", falls ich dies vergessen. Auch überlastet */+ und machten Sie zu Ihren Synonymen 🙂
Mit der Funktion Anrufe in einer if-block ist kein guter Programmierstil. Haben immer eine variable deklariert, die jeweils den Rückgabewert der Methode und verwenden Sie es in den if-block.
Das ist nicht korrekt. Was Sie willkürlich beschreiben als schlechte Praxis geschieht die ganze Zeit, vor allem mit Funktionen, die Boolesche Werte, als hier.
InformationsquelleAutor Joe Pineda | 2009-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Kurzschluss und Auswertung erforderlich sind, um für die Betreiber
||
und&&
in C-und C++ - standards.C++ standard sagt (es sollte eine entsprechende Klausel in den C-standard):
In C++ gibt es eine extra-Falle: Kurzschluss hat NICHT anwenden, um Typen, Operatoren überladen
||
und&&
.Ist es in der Regel nicht empfohlen, um eine überlastung dieser Operatoren in C++, es sei denn, Sie haben eine sehr spezielle Anforderung. Sie können es tun, aber es kann brechen zu erwartende Verhalten in anderer Leute code, vor allem, wenn diese Operatoren werden verwendet, indirekt über die Instanziierung von Vorlagen mit dem Typ überladen dieser Operatoren.
ja, das ist logisch. es fungiert als Argumente für Betreiber&&(a, b) . es ist die Umsetzung, der sagt, was passiert.
litb: Es ist einfach nicht möglich, pass b, um den operator&&(a,b) ohne zu bewerten. Und es gibt keine Möglichkeit, undo-Bewertung b, weil der compiler kann nicht garantieren, es gibt keine Nebenwirkungen.
Ich finde das traurig. Ich hätte gedacht, dass, sollte ich definierte Operatoren && | |
aber Rückgabewert und Argumente der Betreiber kann sich ändern, von boolean auf etwas anderes. Ich verwendet, um zu implementieren "Besondere" Logik mit den DREI Werten ("true", "false" und "unknown"). Rückgabewert ist deterministisch, sondern durch kurzschließen Verhalten ist nicht angemessen.
InformationsquelleAutor Alex B
Kurzschluss-Auswertung und Bestellung von Bewertung, ist eine vorgeschriebene semantischen standard in C und C++.
Wenn es nicht war, code wie dieser wäre nicht ein gemeinsames idiom
Abschnitt 6.5.13 Logischen UND-operator der C99 Spezifikation (PDF-link) sagt
Ähnlich, Abschnitt 6.5.14 Logischen ODER-operator sagt
Ähnliche Formulierungen finden sich in den C++ - standards, siehe Abschnitt 5.14 dieser Entwurf kopieren. Als Steine Noten in einer anderen Antwort, wenn Sie überschreiben && oder ||, dann werden beide Operanden ausgewertet werden müssen, wie es sich in einem regulären Aufruf der Funktion.
Schwer zu finden eine gute Kostenlose link für die C++ - standards verknüpft haben zu einem Entwurf Kopie fand ich mit etwas googlen.
Gilt für POD-Typen. Aber wenn Sie überladen Sie den operator && oder der operator || dies sind die nicht-Verknüpfung.
ja, es ist interessant zu beachten, dass für bool, die Sie immer haben garantiert Bewertung, um & Kurzschluss-Verhalten. da kann man nicht überlasten-operator&& für zwei built-in-Typen. Sie müssen mindestens einen Benutzer definierten Typ die Operanden haben, Verhalten sich anders.
Ich wünschte, ich könnte annehmen, beide Steine und diese beantworten. Da bin ich meistens Interessierte in C++, ich bin der Annahme des anderen, aber muss zugeben, es ist hervorragend, auch! Ich danke Ihnen sehr!
InformationsquelleAutor Paul Dixon
Ja, es Mandate (sowohl Bewertung um und Kurzschluss). In deinem Beispiel, wenn alle Funktionen, die true zurückgibt, wird die Reihenfolge der Aufrufe sind streng von NOR dann functionB und dann functionC. Für diese wie
Gleiche für den Komma-operator:
Sagt man zwischen dem linken und rechten Operanden
&&
,||
,,
und zwischen dem ersten und dem zweiten/Dritten Operanden?:
(conditional operator) ist eine "sequence point". Alle Nebenwirkungen sind vollständig ausgewertet, bevor dieser Punkt. Also, das ist sicher:Beachten Sie, dass der Komma-operator ist nicht zu verwechseln mit der syntaktischen Komma verwendet, die Dinge zu trennen:
Der C++ Standard sagt in
5.14/1
:Und in
5.15/1
:Heißt es für beide neben den:
Darüber hinaus
1.9/18
sagtInformationsquelleAutor Johannes Schaub - litb
Gerade von der guten alten K&R:
Ok, stellt sich heraus, den Sie zitiert haben, dieses alte tutorial. Es ist von 1974 und höchst irrelevant.
InformationsquelleAutor John T
Sehr sehr vorsichtig sein.
Für Basistypen sind diese shortcut-Operatoren.
Aber wenn Sie definieren diese Operatoren für Ihre eigene Klasse oder Aufzählungstypen sind Sie nicht-Verknüpfung. Da dieser semantische Unterschied in Ihrer Verwendung unter diesen verschiedenen Umständen ist es empfohlen, dass Sie nicht definieren diese Operatoren.
Für die
operator &&
undoperator ||
für die grundlegenden Arten der Auswertung Reihenfolge ist von Links nach rechts (sonst kurz schneiden würde schwer sein 🙂 Aber für das überladen von Operatoren, die Sie definieren, dies sind im wesentlichen syntaktischer Zucker für das definieren einer Methode und damit die Reihenfolge der Auswertung der Parameter nicht definiert ist.Und das ist das, was ich sagte. Wenn Sie überlastung && für deine Klasse, dann ist es eigentlich nur eine Methode aufrufen. So können Sie sich nicht auf die Reihenfolge der Auswertung der Parameter. Natürlich können Sie nicht überlastet werden && für POD-Typen.
Sie sind mit dem Begriff "POD-Typen" falsch. Sie können überlastschutz && für jedes struct, class, union-oder enum-POD oder nicht. Sie können nicht überladen && wenn beide Seiten sind numerische Datentypen oder Zeigern.
Ich war mit POD als (char/int/float usw.) nicht aggrigate POD (was ist das, was Sie reden) und ist in der Regel verwiesen auf getrennt, oder mehr explizit, weil es nicht einen integrierten Typ.
Also du meinst "grundlegende Typen" aber", schrieb der POD-Typen"?
InformationsquelleAutor Martin York
Wenn man Wikipedia Vertrauen kann:
http://en.wikipedia.org/wiki/C_(programming_language)#Eigenschaften
Wenn man Wikipedia Vertrauen kann, "Wikipedia ist keine verlässliche Ressource'.
InformationsquelleAutor Sophie Alpert
Ihre Frage kommt zu C++ - operator Vorrang und Assoziativität. Im Grunde, in der Ausdrücke mit mehreren Operatoren und keine Klammern, die compiler-Konstrukte die expression tree, indem Sie folgende Regeln.
Für Sie Vorrang, wenn Sie so etwas wie
A op1 B op2 C
Sie können Dinge entweder als(A op1 B) op2 C
oderA op1 (B op2 C)
. Wennop1
hat eine höhere Priorität alsop2
ist, erhalten Sie den ersten Ausdruck. Andernfalls erhalten Sie das zweite.Für die Assoziativität, wenn Sie so etwas wie
A op B op C
Sie konnte wieder die Gruppe lichtet als(A op B) op C
oderA op (B op C)
. Wennop
verlassen hat, Assoziativität, wir am Ende mit dem ersten Ausdruck. Wenn es rechts Assoziativität, wir am Ende mit dem zweiten. Dies funktioniert auch für Operatoren die gleiche Priorität.In diesem speziellen Fall
&&
hat eine höhere Priorität als||
, so wird der Ausdruck ausgewertet, wie(a != "" && it == seqMap.end()) || isEven
.Die Bestellung selbst ist "Links-rechts" auf der expression-Baum-form. Also müssen wir erst bewerten
a != "" && it == seqMap.end()
. Wenn es wahr ist, der ganze Ausdruck wahr ist, sonst gehen wir zuisEven
. Der Vorgang wiederholt sich rekursiv innerhalb der linken Teilausdruck natürlich.Interessante Leckerbissen, aber das Konzept der Vorrang hat Ihre Wurzeln in der mathematischen notation. Das gleiche passiert in
a*b + c
, wo*
hat eine höhere Priorität als+
.Sogar noch interessanter/obskurer, für eine unparenthasiszed Ausdruck
A1 op1 A2 op2 ... opn-1 An
, wo alle Operatoren haben die gleiche Priorität, die Anzahl der binären Ausdruck Bäume, die wir bilden könnten, ist gegeben durch die so genannte Catalan-zahlen. Für großen
diese wachsen extrem schnell.d
InformationsquelleAutor Horia Coman