Sequenz ,

Der Sequenz-Operator wertet mehrere Ausdrücke sequentiell hintereinander aus wobei alle Ausdrücke zusammen als eine einzige Anweisung gelten. Dieser Operator wird fast auschliesslich nur bei for-Loops verwendet.




0, 10
1, 9
2, 8
3, 7
4, 6
#include <stdio.h>

int main(){
  int i;
  int j = 10;
  for(i=0; i<5; i++, j--){
    printf("%d, %d\n", i, j);
  }
  return 0;
}

Siehe auch for-Loop

Details

Der Sequenz-Operator erwartet zwei Operanden und wird von links nach rechts abgearbeitet. Während in C beide Operanden rvalues bezeichnen, können in C++ beide Operanden rvalues oder lvalues sein. Der Rückgabewert ist in C ein rvalue: Der Wert des zweiten Operanden. In C++ ist der Rückgabewert entsprechend dem zweiten Operanden entweder ein rvalue oder ein lvalue.

Der Sequenz-Operator wird äusserst selten gebraucht. Er wird jedoch verwendet, um mehrere Anweisungen als eine einzige Anweisung gelten zu lassen, was insbesondere bei gewissen Konstrukten mit dem for-Loop nützlich sein kann, da ein for-Loop nur eine einzelne Anweisung für die Startanweisung und die Statusänderung zulässt. Weitere Informationen darüber findet man beim for-Loop.

Von einem anderweitigen Gebrauch des Sequenz-Operators ist abzuraten, da zum einen der Code unleserlich wird, zum anderen der Compiler die üblichen Optimierungen auf die Ausdrücke nicht mehr anwenden kann.

Es ist zu bemerken, dass Kommas , im Code eher zu Parameter- oder Argumentenlisten, Aggregats-Zuweisungen oder Member-Initialisierungen gehören, welche jedoch explizit nichts mit dem Sequenz-Operator zu tun haben.

Überladen des Operators

Der Sequenz-Operator hat grundsätzlich die semantische Bedeutung der sequentiellen Abarbeitung von Ausdrücken, jedoch steht dem Programmierer frei, mittels einer Überladung des Operators beliebige semantische Bedeutungen zu definieren. Es ist jedoch davon abzuraten, da die ohnehin schon seltene Verwendung des Sequenz-Operators den Programmierer durch eine zusätzliche Überladung mit unbekannter Semantik vollständig verwirrt. Dennoch hier die üblichen Kommentare zur Operatorenüberladung:

Die Prototypen für das Überladen des Sequenz-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):

inside class


outside class
Type operator ,(Type);
Type operator ,(Type) const;

Type operator ,(Type, Type);

Im folgenden Beispiel wird eine Klasse für ein Listen-Element präsentiert. Der überladene Sequenz-Operator fügt einzelne Elemente zusammen.





















100
200
300
#include <stdio.h>

class Element{
  int key;
  Element* next;
public:
  Element(int value){key = value; next = NULL;}
  int getKey(){return key;}
  Element* getNext(){return next;}

  Element& operator ,(Element& e2){next = &e2; return e2;}
};


int main(){
  Element elem1(100);
  Element elem2(200);
  Element elem3(300);
  elem1, elem2, elem3;
  Element* e = &elem1;
  while(e){
    printf("%d\n", e->getKey());
    e = e->getNext();
  }
  return 0;
}