Eine Funktion in der Bedingung für eine While-Schleife aufrufen?!?



  • Hallo alle zusammen,

    ich versuche mir selbst C++ beizubringen und hänge gerade bei "linked list"en fest. In einem Buch, welches ich zum lernen nutze ("C++ für Dummies S. 230"), ist ein Beispiel für verkettete Listen aufgeführt, bei dem ich in Zeile 48 nicht mehr weiter komme:

    #include "stdafx.h"
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Kind
    {
    public:
    	string nameDesKindes; //Information der Klasse
    	Kind* pNext;		  //Zeiger auf Nächste Information
    };
    
    Kind* pHead = nullptr;
    
    void verketutngsFunktion(Kind* pNameEinesKindes)
    {
    	pNameEinesKindes->pNext = pHead;
    	pHead = pNameEinesKindes;
    }
    
    Kind* kindHinzufügen()
    {
    	string name;
    	cout << "Namen des Kindes eingeben: ";
    	cin >> name;
    
    	if (name == "exit")
    	{
    		return 0;
    	}
    
    	Kind* pNameEinesKindes = new Kind;
    	pNameEinesKindes->nameDesKindes = name;
    	pNameEinesKindes->pNext = 0;
    
    	return pNameEinesKindes;
    }
    
    int main()
    {
    	cout << "Name eines Kindes einlesen" << endl;
    	cout << "Zum beenden 'exit'eingeben" << endl;
    
    	Kind* pNameEinesKindes;
    
    	while (pNameEinesKindes = kindHinzufügen())
    	{
    		pNameEinesKindes->pNext = pHead;
    		pHead = pNameEinesKindes;
    	}
    

    Der code geht noch weiter, aber den Rest verstehe ich.

    Das Problem liegt für mich in der while-Schleife in Zeile 48.
    Ich habe noch nie eine while-Bedingung mit nur einem "=" oder einer Funktion gesehen .(Ja, das steht da wirklich so mit nur einem "=", der Code läuft auch fehlerfrei, wenn man ihn so eingibt).

    Könnte mir da bitte jemand eine Erklärung zu geben?

    Vielen Dank schon einmal im vorhinein.
    Grüße ElGrummlo



  • Das ist eine normale Zuweisung. Wenn die Funktion keinen Nullpointer geliefert hat, wird der Schleifenrumpf durchlaufen.



  • Aber muss eine Bedingung für eine while-Schleife nicht mit "==" gestaltet werden??(Sorry für mein Halbwisssen, aber ich habe gerade erst angefangen zu lernen 😞 )



  • Eine Zuweisung liefert auch einen Wert zurück.

    Du kannst ja auch sowas wie a = b = c schreiben, das ist a = (b = c). Die Zuweisung mit = liefert wieder den Wert zurück.

    In der while-Bedingung wird aber ein Wahrheitswert erwartet. Das bedeutet, dass der Rückgabewert der Zuweisung einfach in einen bool umgewandelt wird. Und bei Zeigern ist das gleichbedeutend mit einem Vergleich auf nullptr.

    Also sind folgende Zeilen gleich:

    while (pNameEinesKindes = kindHinzufügen())
    while ((pNameEinesKindes = kindHinzufügen()) != nullptr)
    

    Übrigens weiß ich nicht, wir gut das Buch ist, es scheint jedenfalls "new" und "delete" zu lehren und "0" statt "nullptr" zu verwenden. Versuche im Allgemeinen auf new und delete zu verzichten und stattdessen Smartpointer zu benutzen (meistens std::unique_ptr).



  • Damke, habe es jetzt verstanden! 👍
    Ja, das Buch ist so mittel.Ich würde es nur begrenzt weiterempfehlen, da die Beispiele oft unnötig kompliziert wirken. Aber wenn man sich mit viel Zeit wie in der Schule Zeile für Zeile durchbeist und ab und zu mal zusätlich noch Tutorials guckt und in Foren ließt, dann kommt man schon irgendwie durch.


Anmelden zum Antworten