Unterschiede zwischen cout, printf und putchar



  • Hallo!

    Ich bin gerade dabei die einfachsten Grundlagen des Compilerbaus zu erlernen. Nun habe ich ein kleines Beispielprogramm in C++ vorliegen, welches folgendermaßen aussieht.

    #include<iostream>
    
    int lookahead;
    
    void expr();
    void match(int t);
    void error();
    void term();
    
    int main()
    {
    	//unwichtig
    }
    
    void expr()
    {
    	//unwichtig
    }
    
    void term()
    {
    	if(isdigit(lookahead))
    	{
    		putchar(lookahead);
    		match(lookahead);
    	}
    	else
    		error();
    }
    
    void match(int t)
    {
    	//unwichtig
    }
    
    void error()
    {
    	std::cout << "Syntax error\n";
    	exit(1);
    }
    

    Es ist ein Programm um Infix-Operationen in die Postfix Variante zu schreiben (z.B. 6+5 wird zu 65+ ). Nun, solange ich putchar gebraucht funktioniert das Programm auch einwandfrei, doch wenn ich cout oder aber printf gebrauche, so gibt das Programm bei der Eingabe 6+5 5453+ aus. Am wichtigsten ist hierbei folgende Code-Stelle:

    void term()
    {
    	if(isdigit(lookahead))
    	{
    		std::cout << lookahead; //<-hier
    		match(lookahead);
    	}
    	else
    		error();
    }
    

    Ich kann mir nicht erklären, warum bei putchar die Variable lookahead richtig und bei cout falsch ausgegeben wird. Daraus resultieren meine 2 Fragen.

    • Worin liegt der exakte Unterschied zwischen cout und putchar?
    • Ist putchar C++ angehörig oder ist es eigentlich C?

    Danke für alle Antworten!
    Walnut_Burl



  • Keine Ahnung, aber ich hätte Angst, C und C++ hier zu mischen. Entweder cin/cout oder getchar/putchar/printf. Es ist zu fürchten, daß zum Beispiel cin in einen ein paar Byte großen Zwischenspeicher puffert, den die C-Funktionen dann nicht sehen können.



  • volkard schrieb:

    Keine Ahnung, aber ich hätte Angst, C und C++ hier zu mischen. Entweder cin/cout oder getchar/putchar/printf. Es ist zu fürchten, daß zum Beispiel cin in einen ein paar Byte großen Zwischenspeicher puffert, den die C-Funktionen dann nicht sehen können.

    Das meinte ich auch, aber es die Ausgabe der Variable lookahead geht ja leider nur via putchar und leider nicht mit cout . In C schreiben möchte ich eigentlich auch nicht...



  • Walnut_Burl schrieb:

    Das meinte ich auch, aber es die Ausgabe der Variable lookahead geht ja leider nur via putchar und leider nicht mit cout . In C schreiben möchte ich eigentlich auch nicht...

    Ach, weil es ein int ist?
    cout<<char(lookahead)<<
    gibt es auch als ASCII-Zeichen aus.



  • Das war es!

    Danke du hast mir sehr geholfen. Jetzt kann dem Compiler ja eigentlich nichts mehr im Wege stehen... Ein 2. Buch ist auch schon unterwegs 🕶



  • Walnut_Burl schrieb:

    Jetzt kann dem Compiler ja eigentlich nichts mehr im Wege stehen...

    Oh, doch. Compilerbau ist eine der drei Königsdisziplinen der Informatik. Also dann, wenn man die Welt befruchtenden Compilerbau betreibt, wenn man wie Du nicht ein beliebiges Yacc/Bison-Tut/Vorlesung durchhaut, um einen vorausgeplanten Minimalcompiler zu schaffen und danach vor einer unüberwindlichen Wand zu stehen (,die man als dort involvierter Student optimalerweise gar nicht sieht, die 4-Gewinnt-Studenten wollen es auch nicht sehen), sondern ordentlich jeden Stein bestolpert und Schritt für Schritt mühsam und beharrlich die Götter herausfordert.
    Viel Erfolg!



  • Walnut_Burl schrieb:

    Ein 2. Buch ist auch schon unterwegs 🕶

    Ja, der Trend geht zum Zweitbuch. Ich kaufe mir auch noch in diesem Jahr ein zweites. 🤡



  • Ach war das ein Spaß.

    Grammatik erstellen, Grammatik transformieren, First-Mengen- und Follow-Mengen Bestimmung, Parser schreiben, AST bauen und SymboleTabellen pflegen und noch eine Auswertung in eine Datei geschrieben.



  • Off-Topic:

    volkard schrieb:

    Compilerbau ist eine der drei Königsdisziplinen der Informatik.

    Reines Interesse: was sind die anderen beiden?



  • ipsec schrieb:

    Off-Topic:

    volkard schrieb:

    Compilerbau ist eine der drei Königsdisziplinen der Informatik.

    Reines Interesse: was sind die anderen beiden?

    Betriebssystementwicklung und tut mir leid, die dritte darf ich einfach nicht sagen. Sie ist in jüngster Zeit ein wenig in Verruf geraten und Du würdest mir nicht glauben.



  • volkard schrieb:

    und tut mir leid, die dritte darf ich einfach nicht sagen. Sie ist in jüngster Zeit ein wenig in Verruf geraten und Du würdest mir nicht glauben.

    KI?



  • Nexus schrieb:

    volkard schrieb:

    und tut mir leid, die dritte darf ich einfach nicht sagen. Sie ist in jüngster Zeit ein wenig in Verruf geraten und Du würdest mir nicht glauben.

    KI?

    Wohl eher TI.



  • Was ist TI?



  • Theoretische Informatik (Datenstrukturen & Algorithmen). Wenn das nicht das ist, was Volkard meinte, dann sollte er wohl seine Liste auf 4 erweitern. 😉



  • Theoretische Informatik als eine Königsdisziplin der Informatik zu bezeichnen ist so ähnlich wie Bewegung als Königsdisziplin des Sports zu bezeichnen.



    • Die Integration von heterogenen IT-Systemen und Anwendungen in Unternehmen gehört zu den Königsdisziplinen der Informatik
    • Games sind die Königsdisziplin der Informatik
    • Compilerbau ist für mich die Königsdisziplin der Informatik
    • Die Spieleentwicklung kann man ohne Übertreibung die Königsdisziplin der Informatik nennen
    • klObs und Astro haben mit Dr. Heiko Falk eine der Königsdisziplinen der Informatik beleuchtet: Compilerbau.
    • Königsdisziplinen der Informatik schlechthin riskieren: Die Künstliche Intelligenz.
    • die sache nennt sich mustererkennung und ist eine der königsdisziplinen der informatik.
    • also das eigentliche forschen an künstlicher intelligenz, gehört wohl noch zu den königsdisziplinen der informatik
    • Ein Betriebssystem zu schreiben ist aber die absolute Königsdisziplin


  • gegooglet schrieb:

    • Die Integration von heterogenen IT-Systemen und Anwendungen in Unternehmen gehört zu den Königsdisziplinen der Informatik
    • Games sind die Königsdisziplin der Informatik
    • Compilerbau ist für mich die Königsdisziplin der Informatik
    • Die Spieleentwicklung kann man ohne Übertreibung die Königsdisziplin der Informatik nennen
    • klObs und Astro haben mit Dr. Heiko Falk eine der Königsdisziplinen der Informatik beleuchtet: Compilerbau.
    • Königsdisziplinen der Informatik schlechthin riskieren: Die Künstliche Intelligenz.
    • die sache nennt sich mustererkennung und ist eine der königsdisziplinen der informatik.
    • also das eigentliche forschen an künstlicher intelligenz, gehört wohl noch zu den königsdisziplinen der informatik
    • Ein Betriebssystem zu schreiben ist aber die absolute Königsdisziplin

    Zusammengefasst: "Das was ich mache/gerne machen möchte und wovon ich glaube dass ich gut drin sein könnte ist die Königsdiziplin der Informatik"

    Aber irgendwie geht das grade alles am Thema vorbei...


Anmelden zum Antworten