AndAlso in C++?



  • Hallo Forum,

    gibt es einen AndAlso Operator in C++? Ich habe einen Pointer auf ein obj. Ich möchte mit diesem Objekt in einer While Schleife machen:

    while (ptrMyObj!=0 AndAlso ptrMyObj->Ready()) {
    //...
    }
    

    Wie drückt man das in C++ aus?

    Vielen Dank

    Tim



  • Was soll das "Also" bitte bewirken? Der operator &&() dürfte für deine Zwecke doch angemessen sein.



  • Wenn ptrMyObj==0 sollte er den zeiten Operanden lieber nicht auswerten, da man auf Null keine Funktionen auswerten kann.



  • Das sollte AFAIK genau operator&&() tun.



  • Ist es aber nicht, so bin ich ja auf den "Fehler" gestossen.
    Wenn ptrMyObj==0, dann lande ich trotzdem in der Funktion ptrMyObj->Ready() mit der Meldung "Zugriffsverletzung an 0x0000000018"



  • Du suchst anscheinend ein "Kurzschluss-Und", was die zweite Bedingung nur auswertet, falls die erste wahr ist. Genau das gibt's in C und C++ mit dem &&-Operator:

    while (ptrMyObj!=0 && ptrMyObj->Ready()) {
    //...
    }
    


  • ... schrieb:

    Wenn ptrMyObj==0, dann lande ich trotzdem in der Funktion ptrMyObj->Ready() mit der Meldung "Zugriffsverletzung an 0x0000000018"

    Dann hast Du etwas falsch gemacht -- siehe http://codepad.org/IBm1IQuj



  • Argh! Stimmt Ihr habt Recht. Der Bock liegt irgendwo bei mir. Bei diesem Bsp funktioniert es so wie Ihr geschrieben habt:

    class Abc {
    public:
    	bool Ready() {
    		x=5;
    		return true;
    	}
    
    	int x;
    };
    
    int main() {
    	Abc *ptrAbc=0;
    	//ptrAbc = new Abc();
    
    	while (ptrAbc!=0 && ptrAbc->Ready()) {
    		int i = 5;
    	}
    	return 0;
    }
    


  • Kann es was damit zu tun haben, dass es zu Optimierungszwecken dem Compiler vorbehalten ist, wann er welche Funktion auswertet, oder betrifft das nur die Reihenfolge?
    Ich verlass ich mich aber eigentlich auch auf solche &&-statements wo, falls die erste Bedingung unwahr ist, die zweite eine Exception produzieren könnte.



  • wxSkip schrieb:

    Kann es was damit zu tun haben, dass es zu Optimierungszwecken dem Compiler vorbehalten ist, wann er welche Funktion auswertet, oder betrifft das nur die Reihenfolge?
    Ich verlass ich mich aber eigentlich auch auf solche &&-statements wo, falls die erste Bedingung unwahr ist, die zweite eine Exception produzieren könnte.

    Nein. && ist AndAlso und ist zuverlässig ohne Überraschungen.



  • Da ist mir Volkard zuvor gekommen. Ansonsten siehe dieses PDF hier zur Auswertungsreichenfolge:
    http://www.ostc.de/c-precedence.pdf



  • Keine Überraschungen?
    Der Operator && hat eine wunderliche Überraschung, wenn man ihn überlädt, dann mutiert er nämlich vom AndAlso zum gewöhnlichen And, aber sowas Furchtbares wollen wir ja gar nicht machen.



  • Diskutierst du jetzt schon mit dir selber? 🤡
    Aus dem Grund überläd man operator &&() ja auch nicht.



  • Ad aCTa schrieb:

    Aus dem Grund überläd man operator &&() ja auch nicht.

    Doch, tut man. Aber nicht sehr häufig und üblicherweise nicht mit bool als Rückgabetyp.

    Zum Beispiel bei einer Wahrscheinlichkeitsklasse die Wahrscheinlichkeit zweier unabhängig eingetretener Ereignisse. Oder bei einer Menge den Schnitt. Oder bei Lambdas/Funktoren den Und-Operator mit Lazy Evaluation.



  • volkard schrieb:

    Nein. && ist AndAlso und ist zuverlässig ohne Überraschungen.

    volkard schrieb:

    Keine Überraschungen? Der ...

    😃 👍



  • volkard schrieb:

    Also ich habe ihn zwar schon öfters geschrieben, aber nie außerhalb des Kellerlabors eingesetzt.

    Ich eigentlich auch nie. Waren mehr so ein paar ausgedachte Beispiele, bzw. eins aus der Realität (Boost.Lambda).

    volkard schrieb:

    Der Schnitt bei Mengen mit && ist vermutlich ein Fehler.

    Ok, es ist vielleicht nicht sehr intuitiv, eine Funktion Intersection() wäre klarer. Ich dachte an &&, weil ein Und am ehesten die Schnittmenge beschreibt (Elemente, die in A und in B sind). Vielleicht auch &, wenn man überhaupt Operatoren verwendet, da ist die Gefahr kleiner, dass zu schnell mit Bekanntem assoziiert wird.

    volkard schrieb:

    Ich stelle mir gerade vor, statt "p(A und B)" mal locker "p(a) und p(b)" zu schreiben.

    Ich bin mir nicht sicher, was du meinst. Ich hab mir sowas vorgestellt:

    Probability p(0.6);        // Wahrscheinlichkeit für Ereignis P
    Probability q(0.4);        // Wahrscheinlichkeit für Ereignis Q
    Probability both = p && q; // Wahrscheinlichkeit für P und Q (0.4*0.6)
    

    Huch, jetzt ist alles weg? 😮
    Ich hab jetzt trotzdem mal abgeschickt...



  • Nexus schrieb:

    Huch, jetzt ist alles weg? 😮
    Ich hab jetzt trotzdem mal abgeschickt...

    Ja, habe mir gedacht, daß es besser ist, wenn Du ein wenig über das Ziel hinausschießt, als daß alles zu flach gehalten wird. Wir wollen ja am Ende kein Java machen.


Anmelden zum Antworten