Hallo,
Wenn machwas() false liefert, dann kommt es darauf an. Bei PHP und C wird $i-- und --$i *nie* ausgewertet (der Sprachstandard garantiert es), bei C++ kommt es darauf an, ob der &&-Operator für die Operhandentypen überladen wurde - wenn ja, dann wird es ausgewertet, auch wenn machwas() false ist, wenn er nicht überladen wurde, dann nicht (das ist auch übrigens etwas, was viele Leute an C++ kritisieren).
Kleine Nebenfrage, da ich mich mit C++ nicht auskenne: Passiert das immer, wenn der &&-Operator überladen wurde oder hängt das von demjenigen ab, der überlädt (sprich: Der Programmierer, der die Überladung programmiert hat, hat die Wahl, ob dieses oder jenes Verhalten auftritt)?
Ja und nein. Wenn Du den &&-Operator überlädst, gibst Du ja die Klassen der Parameter mit an (für primitive Datentypen alleine kannst Du das nicht überladen). D.h. wenn das weiterhin boolsche Ausdrücke sind, dann passiert Dir in C++ nichts. Wenn Du aber den &&-Operator für eine Klasse Foo überlädst, und in dem obigen Beispiel machwas() ein Objekt dieser Klasse zurückgibt, dann würde in C++ der Dekrement *immer* durchgeführt werden...
Sprich: Sobald er überladen ist, gilt die überladene Variante immer. Allerdings überlädst Du ihn ja nur für spezifische Datentypen. Das macht es allerdings nicht arg weniger verwirrend.
Wenn Du auf Nummer Sicher gehen willst, kannst Du (bool)A && (bool)B machen, um explizit boolsche Ausdrücke miteinander zu vergleichen, dann wird er nie überladen.
(Mein Wissensstand, ist von mir jetzt nicht getestet worden...)
Viele Grüße,
Christian