PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ noob und das Klammerproblem


In der Shwyz als Gast
2010-10-26, 08:12:03
Hallo liebe Gemeinde,

ich befasse mich gerade ein wenig mit C++ in der Theorie und muss etwas umdenken, da ich bisher nur mit python sehr primitive Programme gecodet habe.

Es geht um das Einklammern von Ausdrücken und ob / wieso sie nicht valide sind.

Ins besondere möchte ich kurz nach diesen Expressions fragen:

1.
a=(b=5)
Mein gefühl sagt mir, dass diese Deklaration der Variable a nicht valide ist.

2.
(a=1)

3.
(a=5)*(b=7)
Es fragt sich, ob man einfach die Variable deklarieren kann und direkt im Anschluss die Operation "in einem Rutsch" auf sie ausführen kann. Ich war es bis jetzt immer gewohnt, in einer extra Zeile die Variable zu deklarieren, um sie dann im Anschluss zu verwenden.

4.
(a=b)*(b=5)
Hier ist unklar, ob dies Valide ist, da sich der Ausdruck (a=b) mit der Multiplikation ändert.

5.
(a*3)=(b*5)
Dies ist meiner Meinung zu 100 % nicht möglich, da beide Klammern L-Werte repräsentieren.

Danke für eure kostbare Zeit.

Grüße
In der Shwyz als Gast.

robobimbo
2010-10-26, 09:17:55
IMHO, mal davon ausgehend dass alle Variablen vom Typ int sind.

a=(b=5)
b == 5 --> die Zuweisung ergibt TRUE --> a == TRUE
Ob es valide ist? Wenn a und b vom Typ int ist, ja :)

(a=1)

Dasselbe in grün: a == 1, die Zuweisung ergibt TRUE

(a=5)*(b=7)

Und wieder: a == 5, der Ausdruck in der Klammer ist TRUE, b == 7, der Ausdruck in der Klammer ist TRUE, also multiplizierst du TRUE mit TRUE...

(a=b)*(b=5)
Es wird von links nach rechts ausgewertet. Kommt drauf an was b vorher für einen Wert hatte, ansonsten siehe oben...

(a*3)=(b*5)
Kommt drauf an was in a und b drinnensteht, die meisten compiler initialisieren werte mit 0

Trap
2010-10-26, 09:29:38
Das ist in C++ nicht so einfach zu beantworten, da Operator-Überladung existiert.

Wenn man keinen Typ für die Variablen vorgegeben hat kann alles erlaubt sein. Wenn man einen eingebauten Typ vorgegeben hat müsste meiner Meinung nach alles außer dem letzten erlaubt sein. Einfach im C++ Standard nachgucken ob man Regeln findet, die sowas verbieten: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf (das ist der Draft, aber zu 99% gültig).

Nagelbrett
2010-10-26, 17:17:16
IMHO, mal davon ausgehend dass alle Variablen vom Typ int sind.

b == 5 --> die Zuweisung ergibt TRUE --> a == TRUE
Ob es valide ist? Wenn a und b vom Typ int ist, ja :)

das mit dem True ist zwar nicht ganz falsch, da alles != 0 auf bool gecastet True ergibt, aber prinzipiell wird bei einer Zuweisung immer der zugewiesene Wert zurückgegeben. a wäre also im ersten Beispiel auch 5 (int). Eine implizite Umwandlung nach bool findet nicht statt.

bei 4 bekommt a den alten Wert von b, und b wird danach auf 5 gesetzt.

5 geht so nicht, da hast du Recht.

Matrix316
2010-10-28, 13:01:56
Also unter C# ist


int a, b;

a = (a = 5) * (b = 7);


a am Ende 35

Wenn da aber nicht steht x =... vor den Klammern, gibts einen generellen Fehler, weil sowas geht net. Wenn ein * dazwischen steht, muss auch ein Rückgabewert irgendwas zugewiesen werden.


a= (a = b) * (b = 5)

Gibt einen Fehler, da b kein Wert zugewiesen wurde.