Ich habe C ++ - Code geschrieben und fälschlicherweise den Namen einer Funktion weggelassen WSASocket
. Mein Compiler hat jedoch keinen Fehler ausgelöst und my SOCKET
mit dem ganzzahligen Wert 1 anstelle eines gültigen Sockets verknüpft .
Der betreffende Code hätte folgendermaßen aussehen müssen:
this->listener = WSASocket(address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Aber stattdessen sah es so aus:
this->listener = (address->ai_family, address->ai_socktype, address->ai_protocol, NULL, NULL, WSA_FLAG_OVERLAPPED);
Aus anderen Sprachen kommend, scheint dies eine Art anonymer Typ zu sein. Wie heißt das Feature, falls es sich wirklich um ein Feature handelt?
Was ist seine Aufgabe?
Es ist schwierig, danach zu suchen, wenn Sie nicht wissen, wo Sie anfangen sollen.
for
Schleifen * -Iterationsausdruck, ala
für (int i = 0, j = 0; i <10; ++ i, --j) zu erhalten ... `i=0;j=0;x=i++,j=6;
x und j wären 6 und ich wäre sowieso 1. Wenn das Verhalten von i ++ überschrieben würde, würde es 0 bleiben. Aber jede Anweisung wird aufgerufen und nach Erreichen der,
nur alle Erweiterungen werden verworfen und der nächste Pseudosequenzpunkt wird aufgerufen. Der erste=
weist also nur den Teil nach dem letzten zu,,
aber jeder Punkt wird aufgerufen. Wie auch immer: Ich verstehe nicht, warum Ihr Compiler Sie bei der Neudefinition der Funktionsdeklaration nicht warnt und stattdessen Ihren Code in etwasgcc
undg++
mit der-Wall
Option:warning: left-hand operand of comma expression has no effect [-Wunused-value]
Antworten:
Der Kommaoperator † wertet die linke Seite aus, verwirft ihren Wert und ergibt als Ergebnis die rechte Seite.
WSA_FLAG_OVERLAPPED
ist 1, und das ist das Ergebnis des Ausdrucks; Alle anderen Werte werden verworfen. Es wird nie ein Socket erstellt.† Sofern nicht überlastet. Ja, es kann überladen sein. Nein, Sie sollten es nicht überladen. Treten Sie jetzt von der Tastatur weg!
quelle
Der Komma-Operator macht Sinn aus Ihrem Code.
Sie stellen effektiv ein,
this->listener = WSA_FLAG_OVERLAPPED;
was zufällig syntaktisch gültig ist.quelle
SOCKET
ist ein typedef fürunsigned int
undWSA_FLAG_OVERLAPPED
ist einint
Literal. Wäre dasSOCKET
ein Synonym fürint
, wäre es nicht einmal eine Bekehrung .struct __socket*
, hätten wir weniger Fehler. Aber es gibt einfach zu viel Code, der "weiß"SOCKET
ist ein integraler Bestandteil.Der Compiler wertet jeden Sequenzpunkt nacheinander in der Klammer aus und das Ergebnis ist der endgültige Ausdruck
WSA_FLAG_OVERLAPPED
im Ausdruck.Der Kommaoperator
,
ist ein Sequenzpunkt in C ++. Der Ausdruck links vom Komma wird vollständig ausgewertet, bevor der Ausdruck rechts steht. Das Ergebnis ist immer der Wert rechts. Wenn Sie einen Ausdruck der Form haben (x1, x2, x3, ..., xn), ist das Ergebnis des Ausdrucks immerxn
.quelle