Warum ist die C++ - syntax so kompliziert?
Ich bin ein Anfänger im Programmieren, obwohl ich bisher gelehrt habe mir Python für über ein Jahr und ich lernte C# vor einiger Zeit.
In diesem Monat habe ich angefangen C++ - Programmier-Kurse an meiner Universität und ich habe nur zu Fragen; "warum ist der C++ - code so kompliziert?"
Schreiben "Hallo Welt." in Python ist so einfach wie "print 'Hello world.'" aber in C++ ist es:
# include <iostream>
using namespace std;
int main ()
{
cout << "Hello world.";
return 0;
}
Ich weiß, es ist wahrscheinlich ein guter Grund für all dies aber, warum...
- ... haben Sie die enthalten die <iostream> jedes mal? Haben Sie jemals nicht es brauchen?
- ... gleiche Frage für die standard-Bibliothek, wenn Sie nicht brauchen, std::*?
- ... ist die "main" - Teil eine Funktion? Haben Sie jemals rufen Sie die main-Funktion? Warum ist es ein integer? Warum wird C++ brauchen, um eine main-Funktion, aber Python nicht?
- ... brauchen Sie "std::cout << "? Ist das nicht unnötig lang und kompliziert im Vergleich zu Python?
- ... müssen Sie 0 zurück, auch wenn Sie nie, es zu benutzen?
Dies ist wahrscheinlich, weil ich bin lernen wie basic, C++, aber jedes Programm, das ich gemacht habe sieht bisher wie diese, so ich geben Sie den gleichen code immer und immer wieder. Ist das nicht redundant? Konnte nicht der compiler nur die Eingabe dieses code selbst, denn es ist immer das gleiche (also afaik haben Sie immer include <iostream>, std, int main, return 0)
- Einfache Antwort: C++ und Python sind entworfen, um verschiedene Probleme zu lösen, mit unterschiedlichen Einschränkungen. Verschiedene design-Tore erhalten Sie verschiedene Entwürfe.
- Ich bin nicht sicher, was bedeutet der tag "redundanten-code' in diesem Kontext bedeuten. Die Aufgabe von main() in den meisten nicht-triviale Anwendungen ist nicht nur die Ausgabe in die Konsole. Es ist der Einstiegspunkt für das Programm executon. Das return 0; ist der O. S. das startet das Programm und kann Sie benutzen den Rückgabewert als status-berichtet von Programm-Ausführung. Sie können Lesen möchten Dr. Stroustrup ' s FAQ den ersten, bevor Sie möglicherweise incriminatng C++ von vielen anderen Dingen abgesehen von der syntax @ research.att.com/~bs/bs_faq.html.
- Ernsthaft C++ kann die Biene die Knie, aber ich finde es ist code wirklich kompliziert und tedius.
- Es gibt Programme, die brauchen nicht
<iostream>
. Glauben Sie mir, wenn Sie Sie sehen, wirst du nicht diese einfachen Programme, die enthalten nur<iostream>
. - Dies ist der Grund, warum die Programmierer sollten lernen, low-level-Sprachen, die ERSTE, so dass Sie schätzen können, was high-level-Sprachen für Sie tun.
- Baldur - C++ ist nicht nur für das schreiben von Konsolenanwendungen. Sie können schreiben, Fenster-apps, hintergrund-Dienste, embedded-Systeme, Spiele... im Grunde nichts. Wenn Sie schreiben etwas, das nicht eine Konsole app, werden Sie nicht oft brauchen < iostream >.
- Leon: Als ich noch ein Programmier-Anfänger würde ich stark nicht einverstanden mit Ihnen. Nun, ich bin Diplom-Informatiker und arbeitete 2 Jahre in der Industrie, ich STIMME zu. Sie können nicht gewinnen, den low-level-Verständnis von Dilettantismus nur im high-level-Sprachen.
- Wenn Sie finden, das zu kompliziert ist, dann Frage ich mich, was passiert, wenn Sie beginnen mit Vorlagen..
- Eduardo Mein Freund sagte mir, mit dem lernen zu beginnen Montage, denn das würde mein code weniger schlampig. Ich hatte einfach nicht die Geduld, es zu lernen. Ich denke, es ist eine schlechte Idee, im Nachhinein, oder vielleicht werde ich mehr motiviert zu lernen, low-level-Sprachen, dass ich jetzt besser weiß, wie Sie hilfreich sein könnten. Auch ich möchte mich entschuldigen für das, was viele von Euch vielleicht eine sinnlose Frage, aber zu meiner Verteidigung es war ärgerlich, wenn Sie spüren, dass 65,6% der code, den ich geschrieben hatte, war sinnlos.
- Naveen ich nicht finde das zu kompliziert, ich möchte verstehen was ich Tue, anstatt, Sie zu schreiben, wie ein Affe. Der Lehrer prüft derzeit Dinge, die ich gelernt vor Jahren, aber er sagte nie etwas darüber, warum die Dinge auf diese Weise getan. Das ist der Grund, ich drehte mich zu SO.
- Keine Sorge, ich hatte die gleichen Fragen, als ich umgezogen aus (Scham,...) von Visual Basic und Delphi zu C++.
- Visual Basic? Meine Schule verwendet, um uns zu lehren, Visual Basic eine lange Zeit her und ich hasste jede minute davon. Aus Neugier - macht Unternehmen tatsächlich nutzen VB? Ich habe nur gehört, schlechte Dinge über Sie.
- Ja, leider tun Sie das.
- Gibt es irgendeinen Grund mit VB gegenüber anderen Programmiersprachen?
- Eine weitere: C++ ist wie 30 Jahre, die alten in der Programmierung Welt.
- Gott sei Dank ist Sie havent gesehen die Java-Hello World noch nicht:P
- Ich finde es seltsam, dass Niemand geantwortet hat, die Python-syntax ist einfacher, weil es entworfen wurde, dass Art und Weise - es ist ein harter constraint, der auf die Komplexität von Python.
- Die kurze version: Python hat eine spezielle Magische Wort, um Dinge auf dem Bildschirm. C++ nicht, so müssen Sie eine Referenz-Bibliothek. Dass etwa die Hälfte der "boilerplate"; die andere Hälfte ist, dass die Programme starten, ausgeführt von einer Funktion.
- "Geschlossen als nicht konstruktiv" - erbärmlich. Dies ist einer der größten und am meisten potenziell lehrreiche Fragen, die ich gesehen habe, auf SO...
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++ ist eine low-level-Sprache, die ausgeführt wird, ohne den Kontext eines Dolmetschers. Als solche, es hat viele verschiedene design-Entscheidungen als Python, weil C++ hat keine Umwelt, die Sie sich verlassen können, um die Verwaltung von Informationen wie Typen und Speicher. C++ kann verwendet werden, um zu schreiben, ein Betriebssystem-kernel, wo es ist kein code auf dem Rechner ausgeführt werden, außer für das Programm selbst, was bedeutet, dass die Sprache (einige Bibliotheken sind nicht verfügbar für die so genannte freistehende Implementierungen) muss eigenständig sein. Dies ist der Grund, warum C++ hat kein äquivalent zu Python
eval
noch ein Mittel zur Bestimmung der Mitglieder, etc. einer Klasse, noch andere features, die erfordern, dass eine Ausführungsumgebung (oder einen massiven overhead im Programm selbst, statt eine solche Umgebung)Für Ihre individuellen Fragen:
<iostream>
everytime? Haben Sie jemals brauchen es nicht?#include <iostream>
ist die Richtlinie, dass die Einfuhren der<iostream>
- header in Ihrem Programm.<iostream>
enthält die standard-input - /output-Objekte - insbesonderecout
. Wenn Sie sich nicht mit standard-I/O-Objekte (zum Beispiel, verwenden Sie nur die Datei-I/O, oder das Programm verwendet eine GUI-Bibliothek, oder schreiben eine Betriebssystem-kernel), brauchen Sie nicht<iostream>
std
ist der namespace, die alle von der standard-Bibliothek.using namespace std;
ist in der Art, wiefrom std import *
, in der Erwägung, dass eine#include
Richtlinie ist (in dieser Hinsicht) eher wie ein simplerimport std
- Anweisung. (in der Tat, der Mechanismus ist ziemlich anders, weil C++ nicht verwendenusing namespace std;
automatisch lookup-Objekte instd
; die using-Direktive importiert nur die Namen in den globalen namespace.)Werde ich hier beachten, dass die Verwendung-Richtlinien (
using namespace
) sind Häufig verpönt in C++ - code, wie Sie importieren eine Menge von Namen und kann die Ursache für name-clashes. using-Deklarationen (using std::cout;
) bevorzugt, wenn möglich, so ist die Begrenzung des Umfangs von einer using-Direktive (zum Beispiel, um eine Funktion oder um eine source-Datei). Nicht immer setzenusing namespace
im header, ohne guten Grund.main
ist der Einstiegspunkt in das Programm, wo die Ausführung beginnt. In Python, die__main__
Modul dient dem gleichen Zweck. C++ nicht die Ausführung von code außerhalb einer Funktion definiert wie Python macht, so dass Ihr Einstiegspunkt ist eine Funktion eher als ein Modul.std::cout
ist nur erforderlich, wenn Sie sich nicht importieren Sie diecout
Namen in den globalen namespace, der entweder durch eine using-Direktive (using namespace std;
) oder durch eine using-Deklaration (using std::cout
). In diesem Zusammenhang ist es noch einmal ähnlich wie die Unterscheidung zwischen Python ' simport std
undfrom std import *
oderfrom std import cout
.Den
<<
eine überladene operator für standard-stream-Objekte.cout << value
Anrufecout
's Funktion-Ausgabevalue
. Python braucht keinen solchen zusätzlichen code, weilprint
ist in der Sprache; dies ist jedoch nicht sinnvoll für C++, wo es nicht einmal ein Betriebssystem, noch viel weniger eine I/O-Bibliothek.Nicht.
main
(und keine andere Funktion), hat eine implizitereturn 0;
am Ende. Der Rückgabewert vonmain
(oder, wenn dieexit
Funktion aufgerufen wird, wird der Wert übergeben) übergeben wird, zurück an das Betriebssystem, wie der exit-code. 0 steht für das Programm erfolgreich ausgeführt - es sind keine Fehler aufgetreten, etc. Wenn ein Fehler Auftritt, wird eine nicht-null-Wert zurückgegeben werden soll (oder anexit
).In Antwort auf Ihre Fragen am Ende der post, es kann zusammengefasst werden mit der Philosophie von C++:
Zahlen Sie nicht für das, was Sie nicht verwenden.
Sie brauchen nicht immer zu verwenden stdin oder stdout (Windows/GUI-apps?), noch Sie, immer mit der STL, noch alles, was Sie schreiben, unbedingt verwenden Sie die standard-main (winAPI) etc. Wie eine Vorherige Plakat gesagt, C++ ist eine niedrigere Stufe als Python. Sie werden ausgesetzt, um mehr von den details, die bietet Ihnen mehr Kontrolle über was du tust.
Brauchst du es nicht wenn du nicht gehst, zu verwenden iostreams in diesem Modul. In größeren Programmen, einige Module, die tatsächliche IO direkt, und so wenige wirklich brauchen, zu verwenden iostreams.
Dreht die Frage um: in python geben, die Sie brauchen, um import sys-und/oder os in den meisten nicht-triviale Programme. Warum?
Können Sie mit der Linie oder verwenden Sie den std:: - Präfix. Dies ist sehr ähnlich wie die Wahl von python gibt Sie entweder sagen, "from sys import *" oder "import sys" und dann mit Präfix Dinge, die mit "sys.". In python geben, die Sie haben, zu sagen: "sys.stdout". Ist "std::cout" wirklich schlechter?
Ja, main ist eine Funktion. In der Regel würden Sie nicht rufen Sie main selbst. Der name "main" ist reserviert für den entry-point des Programms. Es gibt eine Ganzzahl zurück, da der Wert, der zurückgegeben wird, als status-code des Programms. In Python geben, die Sie verwenden können, sys.exit, wenn Sie zurückkehren möchten, eine nicht-null-status-code.
Python nicht die selbe Konvention, weil Sie mit Python-Sie können code in ein Modul nicht in einer Funktion. Dieser code wird ausgeführt, wenn Sie laden Sie das Modul. Interessanterweise haben viele Leute das Gefühl, es ist schlechter Stil, um code auf der obersten Ebene eines Moduls und wird stattdessen erstellen Sie eine main-Funktion, indem man Folgendes tut:
Auch, in Python sagen Sie dem Dolmetscher, der mit dem Modul ist die "main" - Modul, wenn Sie es ausführen. zB: "python foo.py". In C, die "main" - Modul ist (effektiv), das man mit einer Funktion namens main. (Wenn es mehrere Module mit einer main-Funktion, es ist ein linker-Fehler.)
Das äquivalent in Python ist tatsächlich "sys.stdout.schreiben(...)". Python print-Anweisung ist ein Sonderfall kurzer hand.
Sagte, viele Menschen fühlen den iostreams Konvention der Verwendung von bit-shifting-Operatoren für IO war eine schlechte Idee. Ironischerweise, Python scheint "inspiriert" von dieser syntax. Wenn Sie verwenden möchten, drucken zu schreiben, um woanders als auf stdout, man kann sagen:
Gehen Sie nicht, es zu benutzen, aber Ihr Programm. Wie bereits erwähnt, ist der Wert, den Sie zurückgeben, ist der status-code des Programms.
Beiseite: ich habe tatsächlich das Gefühl, dass C++ ist kompliziert, aber nicht, weil jeder der Punkte, die Sie erwähnen. Alle Unterschiede, die Sie erwähnen, gehen Weg (in dem Sinne, dass Sie nur so viel Komplexität in Python) sobald Sie zu schreiben beginnen, nicht-triviale Programme mit mehreren Modulen und mehr tun, als einfach nur zu schreiben auf stdout.
Ihnen gehören
<iostream>
wenn Sie ausgeben möchten die Dinge auf der Konsole. Da sich das drucken von "Hallo Welt" beinhaltet die Ausgabe der Konsole, müssen Sieiostream
.Den
main
Funktion wird aufgerufen durch das Betriebssystem, im Grunde. Es wird aufgerufen, mit der Befehlszeilen-Argumente an das Programm übergeben. Es gibt eine Ganzzahl zurück, da muss das Programm einen Fehler zurück-code an das Betriebssystem (das ist der standard-Weg, um zu bestimmen, ob der Letzte Befehl erfolgreich war).Können Sie immer
printf("hello world");
stattstd::cout << "hello world";
wenn Sie gehen wollen C-Stil. Es ist ein bisschen schneller zu schreiben und Sie können tun, formatierte Ausgabe.Du
return 0
ausmain
um anzuzeigen, dass das Programm erfolgreich ausgeführt wurde.Nicht der compiler automatisch alle standard-Bibliotheken und die Nutzung namespace
std
da manchmal Namen Kollisionen führen kann zwischen dem code-und library-code, den Sie nicht wirklich brauchen, zu allen. Sie brauchen nicht immer alle Bibliotheken. Ebenso, manchmal sind Sie mit einer anderen Haupt-routine (Windows-Entwicklung kommt in den Sinn mit Ihren eigenen, verschiedenenWinMain
ab-Funktion). Der compiler auch nicht automatischreturn 0
denn manchmal braucht das Programm, um anzuzeigen, dass es erfolgreich abgeschlossen.main()
- Funktion sowie das OS, obwohl dies verboten ist in C++. Die einzige wirkliche Zweck, dies wäre zum generieren von alle die Lieblings-Fehler.main()
Funktion, aber im wesentlichen ist es das OS, dass mit der Ausführung beginnt, und es muss irgendwo anfangen, irgendwie.Gibt es gute Gründe für all diese Dinge. C++ ist eine sehr umfassende Sprache, die es verwendet für alles von kleinen embedded Systemen bis hin zu Riesen-Anwendungen von 100s von Programmierern. Der Anwendungsfall für ein Typ Gebäude ein kleines Programm, ausgeführt auf einem desktop-PC ist beileibe nicht das einzige. Also manchmal sind die Gebäude Bibliothek-Komponenten. In diesem Fall ist kein main(). Manchmal arbeitest du auf einem kleinen system mit nicht-standard-Bibliothek. In diesem Fall ist kein std. Manchmal wollen Sie bauen ein Unix-tool, das funktioniert mit anderen Unix text-tools und Signale seiner Fertigstellung status mit einem int zurück von main().
In anderen Worten, die Dinge, die Sie beklagen, sind codebausteine auf Sie. Aber Sie sind wichtige details, die variieren, um andere Benutzer der Sprache.
Das erinnert mich an Die Evolution eines Programmierers. Einige der Sprachen und Technologien gezeigt, sind ein bisschen veraltet jetzt, aber Sie sollten Sie bekommen die Allgemeine Idee. 🙂
Einer der Gründe, C++ ist eher kompliziert ist, weil es wurde entwickelt, um die Probleme, die auftauchen, in den großen Programmen. Zur Zeit C++ erstellt wurde, als AT&T, Ihre größte C-Programm wurde über 10 Millionen Zeilen code. Auf dieser Skala, C funktioniert nicht sehr gut. C++ - Adressen viele der Probleme, die Sie bekommen mit dieser Art von Programm.
Mit dieser sagte, ist es auch möglich, eine Antwort auf die ursprünglichen Fragen:
include <iostream>
wo es gebraucht wird. Wenn Sie haben 10.000 C++ - Dateien, es ist durchaus üblich, dass weniger als 1000, teilweise in weniger als 100 produzieren wird den Benutzer sichtbar ausgegeben.print "Hello, world"
davon ausgegangen, dass es ein Standard-Ausgabe, aber macht es schwer zu verallgemeinern. Diecout << "Hello, world"
form macht deutlich, wo der Ausgang geht, aber die gleiche form ermöglicht auchcerr << "Goodbye, world"
undMyTmpFile << "Starting phase #" << i
std::
namespace. Meine 10.000 Dateien werden in einem zusätzlichen 25-namespaces.main
ist eine kuriosität in vielerlei Hinsicht ist die Autostart-Funktion.Baldur:
Sie brauchen nicht immer
<iostream>
. Die einzigen Dinge, die Sie immer benötigen sind:main
Funktion (oder eineWinMain
, wenn Sie schreiben, die Win32-Anwendungen).if
,while
usw.).Alles andere ist Anwendungs-spezifisch.
Als andere Poster sagen, der Rückgabewert der
main
- Funktion ist ein Fehlercode1. Wennmain
0 zurückgibt, glücklich zu sein: alles war OK!1Dies ist nützlich, wenn Sie Programme schreiben, die "kommunizieren" mit anderen Programmen. Die am meisten einfache Weise, dass ein Programm "mitteilen" kann, eine andere, ob es ordnungsgemäß ausgeführt wird, verwenden Sie einen Fehler-code.
Als die Leute gesagt haben, die einfache Antwort ist, dass Sie verschiedene Sprachen mit verschiedenen Zielen. Zur Beantwortung Ihrer spezifischen Fragen...
<iostream>
ist einer der header-Dateien für iostreams, die Teil der C++ - standard-Bibliothek verantwortlich für input/output; in diesem Fall müssen Sie den Zugriff aufstd::cout
. Wenn Sie nicht tun, I/O-Operationen in einer Quellcode-Datei, die Sie nicht brauchen, um es-zum Beispiel, die meisten Dateien mit Klassendefinitionen werden wahrscheinlich nicht brauchen<iostream>
.std
ist der name des namespace enthält Klassen, die in der standard-Bibliothek; es ist es zu vermeiden, Kollisionen mit Namen, die. Python-Pakete und-Module, dies zu tun.Können Sie die
using
Anweisung zu bringen Elemente aus einem anderen Namensraum in Ihrem derzeitigen Umfang, siehe in diesem FAQ-Eintrag für ein Beispiel (und eine Erklärung, warum es schlecht ist, zu blind zu bringenstd
in den Bereich!).Ausführbaren Anweisungen in C++ enthalten sein, innerhalb einer Funktion, und die
main
- Funktion ist definiert als, wo die Ausführung beginnt. In Python, ausführbare Anweisungen gesetzt werden können auf der obersten Ebene eine Datei, und die Ausführung definiert .Können Sie anrufen
main()
wenn Sie es wünschen-es ist nur eine Funktion, nachdem alle-aber es gibt nicht oft einen Grund, dies zu tun. Hinter den kulissen, die meisten Implementierungen von C++ nennenmain()
für Sie einmal einige startup-Zimmerreinigung wurde durchgeführt, indem die Laufzeit-Bibliothek.Den Rückgabewert
main()
ist zurück an das Betriebssystem. Dies ergibt sich aus C und UNIX, in der Anwendung der Programme sind erforderlich, ein 1-byte-exit-status-code, und der Rückkehr, dass der Wert vonmain()
ist eine klare Möglichkeit, dies zum Ausdruck zu bringen.Dies ist nur ein design Unterschied. iostreams ist ein ziemlich Komplexes Biest mit vielen features, und eine der Nebenwirkungen ist, dass die syntax ist ein bisschen hässlich für einfache Aufgaben auf Zeit.
Verwenden Sie es; dies ist der Wert, der an das Betriebssystem zurückgegeben, da der exit-status des Programms.
Python high-level Sprache. C++ ist Mitte-Stufe Sprache.