Einführung in die Trägheit von Operandenstellen in C++ im Rahmen der Lehre des Programmierens mit der Programmiersprache C++. [] (träge Operanden, Rekursion), Lektion, Seite 721201
https://www.purl.org/stefan_ram/pub/c++_traegheit_de (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

Trägheit von Operandenstellen in C++ 

Strikte Stellen

Beide Stellen des Additionsoperators "+" sind strikt, da die zugehörigen Operanden immer  ausgewertet werden. In dem Programmbeispiel "strict.cpp" werden beispielsweise beide  Operanden des Additionsoperators ausgewertet. Dies kann man auch an der Wirkung der Aufrufe der Wertwirkfunktionen sehen. Der Grund für die Striktheit des Additionsoperators ist es natürlich, daß zur Addition in jedem Fall auch die Werte der beiden Summanden benötigt werden.

strict.cpp
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ int u() { ::std::cout << "u"s; return 1; }
int v() { ::std::cout << "v"s; return 1; }} int main(){ u() + v(); ::std::cout << "\n"s; }
System.out
uv

Übungsfrage Welchen Wert hat der Ausdruck "u() + v()" in dem Programm "strict.cpp"?

Übungsfrage Ist die Ausgabe des Programms "strict.cpp" durch die Programmiersprache C++  eindeutig bestimmt?

Träge Stellen

Der Operator "&&" ist ein linksassoziativer zwischengestellter binärer Operator.

logical-and-expression 〉 ::=
inclusive-or-expression 〉 |
logical-and-expression 〉 "&&" 〈inclusive-or-expression 〉.

Die Priorität dieses Operators ist niedriger als die der meisten anderen Operatoren, aber höher als die des Zuweisungsoperators.

Die Werte der Operanden dieses Operators werden zunächst implizit in den Datentyp "bool" gewandelt.

Die rechte Stelle des Operators "&&" ist träge, denn ihr Operand wird nur dann ausgewertet, wenn der gewandelte Wert des linken Operanden der Wert "true" ist.

In dem Programm "lazy.cpp" wird zuerst der Ausdruck "t() && f()" ausgewertet. Da hier der linke Operand den Wert "true" hat, wird auch der rechte Operand ausgewertet. So entsteht die Ausgabe "T F " der ersten Ausgabezeile. Später wird der Ausdruck "f() && t()" ausgewertet: In diesem Fall hat der linke Operand den Wert "false", so daß der zweite Operand nicht mehr ausgewertet wird und die zweite Ausgabezeile dementsprechend nur den Text "" enthält.

Der Wert  des Ausdrucks "t() && f()" und des Ausdrucks "f() && t()" ist jeweils der Wert "false". Dieser Wert wird aber in dem Programm "lazy.cpp" nicht verwendet. Der Wert der Operation "&&" ist nur dann  "true", wenn die Werte beider  Operanden gleich dem Wert "true" sind—sonst ist er immer der Wert "false". Da in dem Beispielprogramm nie beide Operanden den Wert "true" haben, ergibt sich dort stets der Wert "false" als Ergebnis der Operation.

lazy.cpp
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ int t() { ::std::cout << "T "s; return true; }
int f() { ::std::cout << "F "s; return false; }} int main()
{ t() && f(); ::std::cout << "\n"s;
f() && t(); ::std::cout << "\n"s; }
System.out
T F 
F

Aufrufsteuerung

Wenn der Operand einer trägen Stelle ein Funktionsaufruf ist, dann erfolgt dieser auch nur dann, wenn der Operand überhaupt ausgewertet wird. Ein Aufruf als Operand einer trägen Stelle wird also nicht immer ausgeführt, sondern nur unter bestimmten Umständen. Wenn die Auswertung einer trägen Stelle beispielsweise in Abhängigkeit von den Werten bestimmter Operanden erfolgt, dann können diese Operandenwerte sozusagen steuern, ob die Auswertung einer Stelle erfolgt, also beispielsweise auch, ob eine bestimmte Funktion aktiviert wird.

Das folgende Programmbeispiel zeigt Funktionsaufrufe, die genau dann ein Sternchen ausgeben, falls ihr Argumentwert "true" ist.

sternchen.cpp
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ bool sternchen() { ::std::cout << "* "s; return true; }
bool sternchen( bool const i ) { return i && sternchen(); }} int main()
{ ::std::cout << "true : "s; sternchen( true ); ::std::cout << "\n"s;
::std::cout << "false: "s; sternchen( false ); ::std::cout << "\n"s; }
System.out
true : * 
false:

Das Programmbeispiel "sternchen1.cpp" zeigt, wie die Funktion "sternchen" für Argumentwerte zwischen 1 und 3 die durch den Argumentwert angegebene Zahl von Sternchen ausgibt.

Sternchen1.java
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ bool sternchen_b( int const i )
{ ::std::cout << "*"s; return i > 1; }
bool sternchen_a( int const i )
{ ::std::cout << "*"s; return i > 1 && sternchen_b( i - 1 ); }
bool sternchen( int const i )
{ ::std::cout << "*"s; return i > 1 && sternchen_a( i - 1 ); }} int main()
{ sternchen( 1 ); ::std::cout << "\n"s;
sternchen( 2 ); ::std::cout << "\n"s;
sternchen( 3 ); ::std::cout << "\n"s; }
System.out

** 
***

Übungsfrage Erklären Sie genau, wie die Ausgabe des Programms "sternchen.cpp" zustande kommt.

Übungsfrage Welche Unterschiede gibt es zwischen der Funktion "sternchen" und "sternchen_a"?

In dem Programm "sternchen.cpp" rief die Funktion "sternchen" unter Umständen die ihr fast gleiche Funktion "sternchen_a" auf. Tatsächlich kann die Funktion "sternchen" anstelle der anderen Funktion "sternchen_a" genauso gut sich selbst wieder aufrufen, wie in dem Programm "sternchen2.cpp".

sternchen2.cpp
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ bool sternchen( int const i )
{ ::std::cout << "*"s; return i > 1 && sternchen( i - 1 ); }} int main()
{ sternchen( 1 ); ::std::cout << "\n"s;
sternchen( 2 ); ::std::cout << "\n"s;
sternchen( 3 ); ::std::cout << "\n"s; }
System.out

** 
***

Übungsfrage Erklären Sie genau, wie die Ausgabe des Programms "sternchen2.cpp" zustande kommt.

Übungsfrage Der Parameter "i" steht für einen konstanten  Wert. Steht dies nicht im Widerspruch dazu, daß der Wert des Parameters "i" sich im Laufe des Aufrufs "sternchen( 2 )" scheinbar verändert?

Übungsaufgabe Verfolgen Sie den Ablauf des Aufrufs "sternchen( 3 )" mit einem Debugger.

Wenn eine Funktion aufgrund eines Aufrufs der Funktion aktiviert wird, dann wird ein neues Exemplar  der Funktion erzeugt. Ein Exemplar einer Funktion wird manchmal auch als eine Instanz  oder als eine Inkarnation  der Funktion bezeichnet.

Ein Exemplar einer Funktion kann man sich als eine Verwirklichung  oder eine Kopie der Funktion für einen bestimmten Aufruf vorstellen. Entscheidend für das Verständnis ist es, daß dabei auch neue Exemplare  aller Parameter erzeugt werden, die hier auch als Parameterexemplare  bezeichnet werden. Endet die Aktivität eines Funktionsexemplars, so wird das Funktionsexemplar mit allen seinen Parameterexemplaren wieder aufgelöst (vernichtet).

Die Auswertung des Ausdrucks "sternchen( 3 )" erzeugt ein Exemplar der Funktion "sternchen" mit einem Exemplar des Parameters "i". In der folgenden Ablaufdarstellung wird dieses erzeugte Exemplar der Funktion "sternchen0" mit dem Namen "sternchen0" bezeichnet und das Exemplar des Parameters "i" wird mit dem Namen "i0" bezeichnet.

Ablaufdarstellung [Pseudo-Code]
sternchen( 3 );
bool sternchen( int const i0 ) // i0 = 3 
{ ::std::cout << "*"s; return i0 > 1 && sternchen( i0 - 1 );  
bool sternchen( int const i1 ) // i1 = 2 
{ ::std::cout << "*"s; return i1 > 1 && sternchen( i1 - 1 );  
bool sternchen( int const i2 ) // i2 = 1 
{ ::std::cout << "*"s; return i2 > 1 && sternchen( i2 - 1 ); }}}

Im Rumpf des Funktionsexemplars "sternchen0" erfolgt dann der Aufruf "sternchen( i0 - 1 )". Dadurch wird ein weiteres  Exemplar der Funktion "sternchen" erzeugt und das Parameterexemplar "i1" des neuen Exemplars erhält den Wert 2. Jedes der beiden bisher genannten Exemplare des Parameters "i" ist konstant, es handelt sich aber um zwei unterschiedliche Parameterexemplare  zweier unterschiedlicher Exemplare der Funktion "sternchen", daher liegt hier kein Widerspruch dazu vor, daß der Parameter "i" konstant ist. Wenn man sagt, der Parameter "i" sei konstant, dann meint man damit nämlich, daß jedes einzelne Parameterexemplar konstant ist. Anschließend wird die Funktion "sternchen" noch einmal aktiviert, aber da dann das Parameterexemplar "i2" nicht mehr größer als 1 ist, wird sie danach nicht noch ein weiteres Mal aktiviert.

Allgemein gilt: Parameterexemplare werden bei Aktivierung einer Funktion neu erzeugt. Wird eine Funktion erneut aktiviert, wird auch jedes Parameterexemplar erneut erzeugt—auch dann, wenn andere Exemplare derselben Funktion noch aktiv sind, weil die Funktion sich (direkt oder indirekt) selbst aufruft. Jedes Parameterexemplar einer Funktion kann einen eigenen Wert haben.

Ein einziger Parametername, wie der Bezeichner "i", kann also für mehrere Parameterexemplare stehen, falls die Funktion des Parameters mehrfach aufgerufen wird.

Und-Verknüpfung

Die Operation "&&" kann auch als eine Und-Verknüpfung  ihrer Operandenwert angesehen werden. Das Ergebnis einer Und-Verknüpfung ist nur dann der Wert "true", wenn beide Operanden den Wert "true" haben. Falls der erste Operandenwert bereits den Wert "false" hat, dann braucht der zweite Operand gar nicht erst ausgewertet zu werden, weil dann bereits klar ist, daß der Und-Ausdruck den Wert "false" hat.

Das folgende Programm verwendet den Operator "&&" um zu erreichen, daß ein Sternchen nur dann ausgegeben wird, wenn der Wert einer Zahl zwischen 1 und 6 ist.

Sternchen3.java
#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> using namespace ::std::literals; namespace
{ bool sternchen() { ::std::cout << "*"s; return true; }
bool sternchen( int const i ){ return i >= 1 && i < 7 && sternchen(); }} int main()
{ ::std::cout << "0: "; sternchen( 0 ); ::std::cout << "\n"s;
::std::cout << "3: "; sternchen( 3 ); ::std::cout << "\n"s;
::std::cout << "9: "; sternchen( 9 ); ::std::cout << "\n"s; }
System.out
0:  
3: * 
9:

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram721201 stefan_ram:721201 träge Operanden, Rekursion source, source code,sourcecode, Programmier sprache C++ Sprache, C++, CXX, C+, Programm, Programme, C++-Programm C++ Sprache C++ Programmiersprache C++ c++-Programme, Standard C++, Programmieren in C++, Programmieren in CXX, Programmieren in CPP, Programmieren in Cplusplus, Die Programmiersprache C++, Die Programmiersprache CXX, Die Programmiersprache CPP, Die Programmiersprache Cplusplus, Die Programmier sprache C++, Die Programmier sprache CXX, Die Programmier sprache CPP, Die Programmier sprache Cplusplus, CXX-Programmierung, C++-Programmierung, CPP-Programmierung, c-plus-plus, cpluplus-Programmierung, ANSI-C++, ANSI-CXX, ANSI-CPP, ANSI C++, ANSI CXX, ANSI-cpluscplus ISO-C++, ISO-CXX, ISO CPP, ISO C++, ISO CXX, ISO/IEC-C++, ISO/IEC-CXX, ISO/IEC CPP, ISO/IEC C++, ISO/IEC CXX, IEC-C++, IEC-CXX, IEC CPP, IEC C++, IEC CXX, International Standard ISO/IEC 14882 First edition 1998-09-01, ISO/IEC 14882:1998(E), ISO/IEC 14882:2003(E), ASC X3, 7/27/98, c plus plus, C ++, cplusplus, c plus plus, Standard C+ programmieren, Stamdard C++ programmieren, Standart C+ programmieren, Stamdart C++ programmieren, INCITS/ISO/IEC 14882-1998, Information Technology - Programming Languages - C++ (formerly ISO/IEC 14882-1998), Programmieren in C++,Programmiersprache C++ CPP CXX Cplusplus c plus plus International Standard ISO/IEC 14882 First edition 1998-09-01, Softwareentwicklung, Software-Entwicklung, Software Entwicklung, Softwareprogrammierung, Software-Programmierung, Software Programmierung, Softwareherstellung, Software-Herstellung, Software Herstellung, Softwareerstellung, Software-Erstellung, Software Erstellung, Softwareengineering, Software-Engineering, Software Engineering, Softwareenginering, Software-Enginering, Software Enginering, Softwaremethodik, Software-Methodik, Software Methodik, Programmiermethodik, Programmier-Methodik, Programmier Methodik, Softwaredidaktik, Software-Didaktik, Software Didaktik, Methodik des Programmierens, Didaktik des Programmierens, Fachdidaktik des Programmierens, Fach-Didaktik des Programmierens, Programmieren, Programmierung, Computer Science, Informatik, Informatik, Informationspädagogik, Informationspaedagogik, Programmierer, programmieren, Quellcode, Quelltext, Quelle, Quellen, Informatiker, Fachinformatiker, Entwickler, mit Stil, mit Stiel, mit Still, , Einführung, Einfuehrung, Einführungen, Einfuehrungen, eLearning-Modul, e-Learning-Modul, eLearning-Module, e-Learning-Module, Kurs Berlin, Kurse Berlin, Kursus, Vortrag, Vorträge, Vortraege, Lehrgang, Lehrgänge, Lehrgaenge, kostenloses Lehrmaterial, kostenlose Lehrmaterialien, Vorlesung, Vorlesungen, Unterrichtseinheit, Unterrichtseinheiten, kostenloses Unterrichtsmaterial im Internet, kostenlose Unterrichtsmaterialien im Internet, Ausbildung, Ausbildungen, für die Ausbildung, Fortbildung, Fortbildungen, Weiterbildung, Weiterbildungen, Schulung Berlin, Schulungen Berlin, Internetschulung, Webschulung, Kursunterlage, Kursunterlagen, trainer Berlin, Didaktik, Informatikunterricht, Primer, Skript FH, Skripte FH, Skriptum FH, Skripts FH, Script FH, Scripte FH, Scriptum FH, Scripts FH, howto, how-to, how to, Lehrbuch, Buch, Bücher, Buecher, Bericht, Crash Kurs Berlin, Crash-Kurs Berlin, Crashkurs Berlin, Report, Sachtext, Sachtexte, Übung, Übungen, Uebung, Uebungen, course, PbclevtugFgrsnaEnz, lecture note, lecture notes, Tutorial, Tutor, Tutorium, Teacher, Lehrer Berlin, Trainer Berlin, Beratung Berlin, Anleitung zum, Anleitungen zum, Einführung, Einfuehrung, Einführungen, Einfuehrungen, Handbuch für, Handbücher, Handbuecher, Support, Diplomarbeit, Facharbeit, Hausarbeit, Hausarbeiten, Werk, Werke, Text, Übungsblatt, Uebungsblatt, Lösung, Loesung, Lösungen, Loesungen, Auflösung, Aufloesung, Auflösungen, Aufloesungen, Facharbeit, Facharbeiten, Forum, Training, manual, Folie, Folien, Lehrmittel, beratung, Definition von, Allgemeine Erklärung, Allgemeine Erklaerung, Allgemeine Erklärungen, Allgemeine Erklaerung, Allgemeine Erklaerungen, Einfache Erklärung einfach, Einfache Erklaerung einfach, Einfache Erklärungen, Einfache Erklaerung, Einfache Erklaerungen, zum Thema, FAQ, FAQs, Konzept, Lernkurs, Lern-Kurs, Lernkurse, Lern-Kurse, eine kurze Erklärung, Begriff, Begriffe, Erklärung zu Begriffen, begriffbestimmung, begriffbestimmung, Begriffsbestimmung, Begriffserklärung, Begriffserklaerung, Wort, Worterklärung, Worterklaerung, Definition, Beispiel, Beispiele, Bedeutung, Bedeutungen, was bedeutet, Begriffsdefinition, für Anfänger, fuer Anfaenger, für Einsteiger, für Beginner, zum selber Lernen, handout, hand out, web based training, WBT, Net Based Training, NBT, computer based training, CBT, virtual learning environment, virtual university, für die Schule, Seminar, Seminare, Vorgehensweise, Pädagogik, Paedagogik, Akademie, Onlineacademie, Onlineakademie, Wissen, Unterrichtsvorbereitung für das Fach, Unterricht, für Lehrer, für Lehrerinnen, Referat, Referate, Hausaufgabe, Hausaufgaben, Tip, Tipp. Tipps und Tricks, Tips und Tricks, Methode, Methoden, Methodik, Funktion, Funktionsweise, Aufbau, Prinzip, Grundlage, Grundlagen, Internetschulung, Unterlage, Unterlagen, Struktur, Frage, Fragen, Antwort, Antworten, Schulunterricht, zum erlernen, was ist das?, wie?, lerne, Onlineausbildung, Onlinelehrgang, Onlinekurs, Onlinebuch, Webbuch, Academy, Fachhochschule, FH, TFH, Hochschule, Universität, Universitaet, Uni, Schule, Berufsschule, Gymnasium, Erste Schritte mit, Dozent, Dozenten, Zusammenfassung, Übersicht, Term, Fachwort, Fachbegriff, Fachbegriffe, Grundbegriff, Grundbegriffe, Lektion, Lektionen, Bedienungsanleitung, Bedienungsanleitungen, Spezialist, Spezialisten, Coaching, Coach, Fachbuch, technologie, Unterschied zwischen, Unterschiede zwischen, lehren, unterrichten, für das Studium, für Studenten, für Studentinnen, für Studierende, für Schüler, für Schülerinnen, Wie kann ich, Wie kann man, Hilfe, selber, erstellen, Erstellung, Beginner, Online-Seminar, Online-Kurs, Online-Schulung, ich, gebrauchsanweisung, gebrauchsanleitung, Bedienungsanweisung, Einweisung, Kurzinfo, Internet-Kurs, Internet-Kurse, Online-Training, Intensiv, Intensivkurs, Vortragsreihe, Präsentation, Grundzüge, Mitschrift, Mitschriften, Verständnis, verstehen, anwenden, Hintergrundwissen, Hintergrund, Hintergründe, content, Funktionsprinzip, Schritt für Schritt; E-Learning; elearning; online learning; Fernlehre, Fernlehrgang, Fernlehrgänge, Referent, Referenten, Fernkurs, Fernkurse, Fernstudium, Fernschule, Fernuniversität, Fernlehrer, Denken, Qualifizierungsmaßnahme, Qualifizierung, Qualifizierungen, Volkshochschulkurs, Volkshochschulkurse, Internet-Learning-Plattform, Online-Learning-Plattform, E-Learning-Plattform, Internetlearning-Plattform, Onlinelearning-Plattform, Elearning-Plattform, jetzt, Kochbuch, einfach erklärt, Kenntnis, Kenntniss, Kenntnisse, deutsche Hilfe, lernen und verstehen; blended learning; courseware, Profi, Profis, professionell, professionelle, professionelles, profesionell, profesionelle, profesionelles, professionel, gekonnt, für Könner, Grundkurs, Leistungskurs, Aufbaukurs, Lehrtext, Lehrtexte, Fachtext, Fachtexte, Ausarbeitung, distance learning, Online Seminar, distance education, Online Tutorium, Online Tutorien, technology-based learning, Computer based learning, CBL, Internet Based learning, IBL, Web based learning, WBL, online-learning, OL, online-training, OT, CAI, Computer Assisted Instruction, CUU, Computerunterstützter Unterricht, Computer-unterstützter Unterricht, Know how, Grundkenntnis, Grundkenntnisse, Kompetenz, Schulungsunterlagen, Insiderwissen, Rat, Lehrerinnen und Lehrer, ABC, Überblick, Arbeitsblatt, Sekundarstufe, Oberstufe, Material, Materialien, Unterrichtsentwurf, Unterrichtsentwürfe, Lerntip, Lerntips, Lerntipp, Lerntipps, ebook, schnell lernen, Lerner, Lernender, Lernende Erwachsenenbildung, Frage und Antwort, Selbststudium, Selbstudium, Umschulung, , kostenlos, kostenlose, kostenloses, kosten los, kosten lose, kosten loses, gratis, free, frei, freie, freies, privat, private, privates, homepage, home-page, home page, website, web site, webpage, web-page, web page, webpages, web-pages, web pages, webseite, Web-Seite, Webseite, Webseiten, Web-Artikel, Web Artikel, online, on-line, on line, download downloaden, down load, or, deutsch, deutsche, deutsches, deutscher, Deutschland, deutschsprachig, deutschsprachige, deutschsprachiges, german, germany, and, uebersicht, Uerbersicht, uebersichten, Uebersichten, Übersicht, übersicht, Übersichten, übersichten, Uebersicht, uebersicht, Uebersichten, uebersichten, Info, Infos zu, Information über, ueber, Informationen über, Auskunft, Auskünfte, Auskuenfte, Dienst, PbclevtugFgrsnaEnz, Angebot, Angebote, Anbieter, server, für, fuer, in, an, keyword, keywords, key word, keywords, internet, internets, net, network, net work, networks, net works, web, www, world wide web, Theorie, Praxis, Anwendung, DV, IT, glossar, fachwörterbuch it-glossar, computer lexikon, Computerlexikon, Computer-Lexikon, Lexikon, computer lexicon, Computerlexicon, Computer-Lexicon, Lexicon, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 was ist ein, was ist das, was sind, definiere, definition, define, Inhalt, html, xhtml, free im netz, PDF Text, digital, digitale, binär, binäre, elektronisch, elektronische, fachbegriff, fachbegriffe, konzept, Begriff, allgemein, allgemeine, allgemeines, Technik, Datentechnik, Digitaltechnik, Binätechnik, online lesen; , Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd721201, slrprddef721201, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/c++_traegheit_de