Operatoren in C?
Hallo,
ich habe Java in der Schule gelernt, an der Uni jetzt C. Ich kann also schon ein paar Brücken schlagen, da man aber in der Uni an die Sache viel genauer ran geht, fange ich an manche Dinge zu hinterfragen, um sie besser zu verstehen. Das ist ja eigentlich gut.
Also: In C gibt es ja diese Ausdrücke, Zeichenfolgen also die einen Wert haben. Eine Anweisung ist ein Ausdruck mit ";". Ich habe in der Schule eine Anweisung mit einem Aufruf gleichgesetzt, aber wieso legt die Definition nur! Wert darauf, das die Zeichenfolge einen Wert hat.
Kann ich mir das so erklären, dass wenn eine Anweisung geschrieben wird, man dem Rechner sagt: "Du ich habe hier etwas mit einem Wert hingeschrieben, berechne mir diesen Wert". Weil in so einem Ausdruck dann Operatoren, wie Zuweisungen, usw. vorkommen können, werden diese dann ausgeführt um den Wert der gesamten Anweisung zu erhalten.
Danke
Hoffentlich verständlicher:
Ich versuche nachzuvollziehen, warum man bei Anweisungen nur die Betonung auf den Wert eines Ausdrucks setzt. Es geht mir einfach um das Bewerten: Kann ich mir das so erklären, dass wenn eine Anweisung geschrieben wird, man dem Rechner sagt: "Du ich habe hier etwas mit einem Wert hingeschrieben, berechne mir diesen Wert". Weil in so einem Ausdruck dann Operatoren, wie Zuweisungen, usw. vorkommen können, werden diese dann ausgeführt um den Wert der gesamten Anweisung zu erhalten.
Ein Auslöser von diesen Gedanken war, der Kommaoperator: Der hat ja als Gesamtausdruck nur den letzten Wert hinter dem Komma. Warum sollte er also die andern noch beachten.
Mein Idee: Der Rechner will, wenn eine Anweisung gegeben ist, den Wert davon berechnen, also führt er die Operatoren durch. Jeder Operator ist dann wie ein Werkzeug, dass dann benutzt wird, wobei nur deren Gesamtwert später interessant ist
2 Antworten
C ist eine ziemlich schlampige Programmiersprache. Dass man Anweisungen als Ausdrücke missbrauchen kann, vergessen wir jetzt erst einmal ...
Ein Ausdruck ist praktisch eine Formel, mit der man etwas ausrechnen kann.
Eine Zuweisungsanweisung, z.b. LHS = RHS befielt dem Rechner, RHS auszurechnen und LHS zuzuweisen. (LHS/RHS steht für "left hand side"/"right hand side", also linke Seite/rechte Seite).
Spannend wird es, was denn LHS (in C auch "lvalue" genannt) eigentlich sein darf.
Beispiele:
int a,b,c;
c = a + b; // c ist zulaessig
int a[4],*p;
p = a + 2;
*p = 123; // *p ist auch zulaessig
int a,b,c,d;
c + d = a + b; // geht nicht
(in C++ wird das dann noch verrückter)
... und wir erinnern uns daran, dass in C eine Zuweisung auch ein Ausdruck sein darf.
int a,b;
a = (b = 3);
Das wird von Compilern akzeptiert, ist aber Pfui (und in dem Bereich, in dem ich arbeite, regelrecht verboten (MISRA)).
Die Anweisung (b = 3) weist b den Wert 3 zu. In ihrer Eigenschaft als Ausdruck liefert sie den letzten Wert, der zugewiesen wurde, also 3. Damit wird a der Wert b (also 3) zugewiesen.
Da solche Konstrukte rechts-assoziativ sind (also von rechts nach links abgearbeitet werden, darf man die Klammern auch weglassen.
int a,b;
a = b = 3;
weist also a und b den Werte 3 zu.
Ja, man kann eine Anweisung als Ausdruck "missbrauchen".
Ein Klassiker ist (außer c = b = a) so etwas wie
int c;
while((c = getc()) != EOF) {
..
}
getc() liest von der Standard-Eingabe ein Zeichen ein. Wenn keins mehr verfügbar ist , kommt der spezielle Wert EOF (end of file) zurück.
c = getc() ist eine Anweisung, aber der Wert, den getc() zurückgab, wird hier gleichzeitig als Ausdruck in der Bedingung != EOF verwendet.
Du bringst hier einiges durcheinander: In C gibt es (wie in Java) Ausdrücke und Anweisungen.
Ein Ausdruck mit Semikolon ist eine spezielle Form von Anweisungen. Der Wert des Ausdrucks wird dabei weggeworfen. Nur die Seiteneffekte bleiben.
Ein Ausdruck ohne Seiteneffekte ist als Anweisung nutzlos. Das ist in Java nicht anders.
Wirklich danke für die Antwort, aber als Student interessiert mich natürlich auch die Theorie also auch der "verbotene Teil". Was steckt also hinter den Ausdrücken bei Anweisungen. Geht es hier dann allgemein wirklich nur darum den Wert zu erhalten und dadurch werden dann Zuweisungen durchgeführt?