Was macht (ausdr1, ausdr2) auf der rechten Seite einer Aufgabe?

8

Ich habe kürzlich meinen alten Code angeschaut und kann nicht herausfinden, was das ist oder ob es gültig ist. Der Code ist etwas wie:

%Vor%     
thrower 24.09.2016, 12:25
quelle

4 Antworten

14

Es ist eine Verschleierung. Der Komma-Operator wertet alle Argumente von links nach rechts aus, verwirft aber alle Argumente bis auf das letzte Argument. Der formale Typ des gesamten Ausdrucks ist der Typ des letzten Arguments.

(Beachten Sie auch, dass das Komma selbst ein Sequenzpunkt ist.)

string2 wird der Wert in der Map unter key string1.

    
Bathsheba 24.09.2016, 12:26
quelle
6

Der Ausdruck "s", string2 verwendet das eingebaute 1 Komma Betreiber . Es hat die folgende Semantik:

  

In einem Komma-Ausdruck E1, E2 wird der Ausdruck E1 ausgewertet, sein Ergebnis verworfen und seine Nebenwirkungen werden beendet, bevor die Auswertung des Ausdrucks E2 beginnt (beachten Sie, dass ein benutzerdefinierter Operator die Sequenzierung nicht garantieren kann) (< em> bis C ++ 17 ).

     

Der Typ, der Wert und der Werttyp des Ergebnisses des Kommaausdrucks entsprechen genau dem Typ, dem Wert und dem Werttyp des zweiten Operanden, E2.

Im Falle Ihres Code-Snippets ist es überhaupt nicht nützlich, und sein einziger Zweck ist es, Leser zu verwirren. Da die Auswertung von "s" keine Nebenwirkungen hat, ist der Code identisch mit diesem:

%Vor%

1 Dies setzt voraus, dass kein benutzerdefiniertes operator, definiert wurde, das den Argumenten entspricht. Wenn ja, kann es alles tun, und der Rest dieser Antwort gilt nicht. Sie müssen in den Quellcode schauen, um herauszufinden, was der Ausdruck ergibt.     
IInspectable 24.09.2016 12:46
quelle
4

Dies ist wahrscheinlich der Komma-Operator, der alles auswertet und dann alles außer dem Wert auf der rechten Seite verwirft.

Aber, wenn operator,( char const*, string2 ) überladen ist, könnte es alles tun (wobei string2 der Typ von string2 ist).

Suchen Sie nach solchen Überladungen.

Beachten Sie, dass, wenn string2 ein std::string ist, solche Überladungen Ihr Programm schlecht aussehen lassen, kein Diagostic erforderlich. Wird die Leute nicht davon abhalten, es zu tun. Und es kann "funktionieren" und trotzdem erlauben , (zum Beispiel) eine Verkettung von Strings zu verursachen.

    
Yakk 24.09.2016 13:02
quelle
1

Komma ist ein Operator, der Argumente von links nach rechts auswertet und den Wert des Elements mit der höchsten Priorität hat.

Zum Beispiel:

%Vor%

Von links wird also a+=b zuerst ausgewertet, was a auf 2+3 setzt, dann wird a*b ausgewertet und der Ausdruck hat den Wert 5*3 , welcher Wert verwendet wird. Also c ist 15

    
xinaiz 24.09.2016 12:38
quelle

Tags und Links