c++ Anfänger

yvikiwi

Newbie
Registriert
Okt. 2020
Beiträge
2
Hallo, ich fange gerade an mit c++ zu programmieren. Ich frage mich nun warum vor der main methode ein int steht und nicht z.B. ein char oder etwas anderes?

#include <iostream>

int main() {
std::cout << "Hello world!" << std::endl;

return 0;
}
 
Das ist der Code als Zahl den die Anwendung liefert wenn sie beendet wird.

In der Regel, wie auch bei dir, bedeutet '0' das die Anwendung korrekt durchgelaufen ist.
Ein Rückgabewert ungleich 0 ist dagegen ein Fehler.
Die genaue Zahl kann darüber Auskunft geben um welchen Fehler es sich handelt, das ist aber Anwendungsspezifisch.

Bonus:
Andere Sprachen regeln das auch gerne anders, in Java z.B. wird stattdessen eine Exception geworfen die um einiges Aussagekräftiger sein kann.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: yvikiwi und pseudopseudonym
Das hat mit deinem returnwert zu tun ("return 0;").
Das ganze gehört eigentlich zum Thema Funktionen.

Eine andere möglichkeit wäre z.B.
C++:
bool test() {... return true}
oder
C++:
bool test() {... return false}
oder
C++:
float test() {... return 0}

Da du dich aber mit dem Thema noch nicht auskennst, empfehle ich dir bei "int main" und "return 0" zu bleiben.
Den grund dafür hat pmkrefeld schon erklärt.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: yvikiwi
yvikiwi schrieb:
Ich frage mich nun warum vor der main methode ein int steht und nicht z.B. ein char oder etwas anderes?
Das ist letztlich Konvention. Ursprünglich hatte main() überhaupt keinen "vorgeschriebenen" Typ, das wurde erst später so festgelegt. Siehe:

https://stackoverflow.com/a/54433133/170194
At the time Kernighan and Ritchie wrote, int was the default type. Computing was in general simpler than it is today and had more constrained resources. Languages were designed to satisfy simple needs. And they were not completely designed; they evolved from scratch, with changes contributed by different people in different places with different things in mind. So the C at the time was not designed with modern ideas about type safety or being strict about grammar to reduce the frequency of errors. Some features put into it were things that people thought were nice and immediately useful, not necessarily things that had been analyzed for their deeper effects or future effects.
One motivating factor in language design was brevity. int was a frequently used type, because it was intended to be the “natural” type for whatever machine was being used, so it was convenient to make it the default. Therefore, many declarations defaulted to int, so it was not required.
Modern compilers may still allow the absence of int so that old code can still be compiled. Often, such compilers have switches to be more strict about which language dialect(s) they accept. For example, in GCC and Clang, you can specify -std=c11 to request stricter conformance to the C standard. (And -std=c17 or -std=c18 may be available soon.) When writing new programs, you should use such switches so that your compiler will issue diagnostics about code that does not conform to modern standards. This will help write code that better conforms to the current standard, has more well-defined behavior, and is more likely to remain useful longer into the future.
 
  • Gefällt mir
Reaktionen: yvikiwi
Valvana schrieb:
Eine andere möglichkeit wäre z.B.
Nein, das sind keine gültigen Möglichkeiten (siehe hier) und sollte man auch nicht machen. main hat den rückgabetyp int und keinen anderen. Welche Compiler falsche Rückgabetypen von main mit welchen flags jeweils trotzdem kompilieren weiß ich nicht, hoffentlich weigern sich die meisten.
 
  • Gefällt mir
Reaktionen: nullPtr, yvikiwi und Drahminedum
@yvikiwi Vielleicht kurz zum Hintergrund des Returncodes: die Konvention 0 = alles ok, alles andere = Fehler ist kein C(++) spezifisches Verhalten, sondern eigentlich in allen (Kommandozeilen-)Programmen Gang und Gäbe. Linux (bzw. die Shells) bieten dafür eine eingebackene Unterstützung. Es ermöglicht bei automatischen Prozessen (in aller Regel bei Programmen die über die Kommandozeile gesteuert werden) darauf zu reagieren.

Dadurch sind Aufrufe wie
Bash:
program-one && program-two
möglich. Tritt bei
Bash:
program-one
ein Fehler auf, kann man sein Script/Aufruf (außen herum) so konfigurieren, dass dann
Bash:
program-two
gar nicht erst aufgerufen wird.

Will man automatisiert Programme ausführen ist das enorm hilfreich, da man so weiß, ob ein Befehl erfolgreich ausgeführt wurde. (Behalte das immer im Hinterkopf wenn du selbst solche Tools schreibst: 0 = alles ok, kein Fehler, alles andere = da ging etwas schief/ich konnte nicht alles so tun wie du es von mir wolltest)

pmkrefeld schrieb:
Bonus:
Andere Sprachen regeln das auch gerne anders, in Java z.B. wird stattdessen eine Exception geworfen die um einiges Aussagekräftiger sein kann.

Strickt da Java eigentlich "trotzdem" noch einen Returncode (1?) dazu? Vermutlich, oder?
 
  • Gefällt mir
Reaktionen: yvikiwi
cmi777 schrieb:
Strickt da Java eigentlich "trotzdem" noch einen Returncode (1?) dazu? Vermutlich, oder?

Java ist hier ein Sonderfall, da es an sich keinen Ausführbaren Code produziert.
Im Gegensatz zu C++ laufen Java-Anwendungen in einer JVM (Java Virtual Machine),
um ein Java-Programm zu starten wird die JVM ausgeführt mit Parametern die zeigen welcher Java-Code ausgeführt werden soll und wo sich dieser befindet. Hört sich komplizierter an als es ist.
Wenn dann würde ich aber erwarten dass die JVM ein Return Code zurückliefert und nicht die Java-Anwendung die man geschrieben hat.

Habe jetzt keine Zeit nachzugoogeln und habe mich damit auch nie in der Tiefe beschäftigt, vermute aber dass das Return Code Konzept wahrscheinlich aus Standards wie POSIX kommt.
 
  • Gefällt mir
Reaktionen: yvikiwi
@pmkrefeld Du hast Recht, ungeschickt formuliert. Ich meine natürlich wenn man (bspw.) ein JAR ausführt. Das wird dann aber ein losgelöster Mechanismus der JVM sein und der wird das passend zu den Konventionen/Standards handhaben.
 
  • Gefällt mir
Reaktionen: yvikiwi
Valvana schrieb:
Eine andere möglichkeit wäre z.B.
C++:
bool main() {... return true}
oder
C++:
bool main() {... return false}

Und das wird mit Sicherheit nicht das bewirken, was du gerne hättest.
 
  • Gefällt mir
Reaktionen: yvikiwi
Zurück
Oben