Perché la sintassi C++ è così complicata?

2022-07-29 10:30:12

Sono un principiante della programmazione anche se insegno Python da solo da circa un anno e ho studiato C# qualche tempo fa.

Questo mese ho iniziato i corsi di programmazione C++ nella mia università e devo solo chiedere; "perché il codice C++ è così complicato?"

Scrivere "Ciao mondo". in Python è semplice come "print 'Hello world.'", ma in C++ è:

# include <iostream>
using namespace std;

int main ()
{
    cout << "Hello world.";
    return 0;
}

So che probabilmente c'è una buona ragione per tutto questo, ma perché...

  • ... devi includere ogni volta? Ti capita mai non di averne bisogno?
  • ... stessa domanda per la libreria standard, quando non hai bisogno di std::*?
  • ... la parte "principale" è una funzione? Ti capita mai di chiamare la funzione principale? Perché è un numero intero? Perché C++ deve avere una funzione principale ma Python no?
  • ... hai bisogno di "std::cout << "? Non è inutilmente lungo e complicato rispetto a Python?
  • ... devi restituire 0 anche quando non lo utilizzerai mai?

Questo è probabilmente dovuto al fatto che sto imparando un C++ di base, ma ogni programma che ho realizzato finora è simile a questo, quindi devo ridigitare lo stesso codice più e più volte. Non è ridondante? Il compilatore non potrebbe semplicemente inserire questo codice, dal momento che è sempre lo stesso (cioè afaik includi sempre , std, int main, return 0)

- Iceland_jack

Source
Risposta


32
  • C++ è un linguaggio di basso livello che viene eseguito senza il contesto di un interprete. In quanto tale, ha molte scelte di progettazione diverse rispetto a Python, perché C++ non ha un ambiente su cui fare affidamento per gestire informazioni come tipi e memoria. C++ può essere usato per scrivere un kernel del sistema operativo in cui non c'è codice in esecuzione sulla macchina ad eccezione del programma stesso, il che significa che il linguaggio (alcune funzionalità di libreria non sono disponibili per le cosiddette implementazioni indipendenti) deve essere autonomo. Questo è il motivo per cui C++ non ha equivalenti a eval di Python, né un mezzo per determinare i membri, ecc. di una classe, né altre funzionalità che richiedono un ambiente di esecuzione (o un enorme sovraccarico nel programma stesso invece di un tale ambiente)

    Per le tue domande individuali:

    • devi includere <iostream> ogni volta? Non ne hai mai bisogno?

    #include <iostream> è la direttiva che importa l'intestazione <iostream> nel tuo programma. <iostream> contiene gli oggetti di input/output standard, in particolare cout. Se non stai usando oggetti I/O standard (ad esempio, usi solo file I/O, o il tuo programma usa una libreria GUI o stai scrivendo un kernel del sistema operativo), non hai bisogno di }^{

    • stessa domanda per la libreria standard, quando non hai bisogno di std::*?

    <iostream> è lo spazio dei nomi contenente tutta la libreria standard. std è un po' come using namespace std;, mentre una direttiva from std import * è (a questo proposito) più simile a un barebone }^{ istruzione. (in realtà il meccanismo è piuttosto diverso, perché C++ non usa #include per cercare automaticamente gli oggetti in import std; la using-directive importa solo i nomi nello spazio dei nomi globale.)

    Noterò qui che le direttive using (using namespace std;) sono spesso disapprovate nel codice C++, poiché importano molti nomi e possono causare conflitti di nomi. Le dichiarazioni-utilizzo (std) sono preferite quando possibile, così come la limitazione dell'ambito di una direttiva-utilizzo (ad esempio, a una funzione oa un file sorgente). Non inserire mai using namespace in un'intestazione senza una buona ragione.

    • la parte "principale" è una funzione? Ti capita mai di chiamare la funzione principale? Perché è un numero intero? Perché C++ deve avere una funzione principale ma Python no?

    using std::cout; è il punto di ingresso del programma, dove inizia l'esecuzione. In Python, il modulo using namespace ha lo stesso scopo. C++ non esegue codice al di fuori di una funzione definita come fa Python, quindi il suo punto di ingresso è una funzione piuttosto che un modulo.

    • hai bisogno di "std::cout << "? Non è inutilmente lungo e complicato rispetto a Python?

    main è necessario solo se non importi il ​​nome __main__ nello spazio dei nomi globale, né tramite una direttiva using (} ^{) o da una dichiarazione using (std::cout). A questo proposito, è ancora una volta molto simile alla distinzione tra cout e using namespace std; o using std::cout di Python.

    Il import std è un operatore sovraccaricato per oggetti flusso standard. from std import * chiama la funzione di from std import cout per generare <<. Python non ha bisogno di tale codice aggiuntivo perché cout << value è integrato nel linguaggio; questo non ha senso per C++, dove potrebbe non esserci nemmeno un sistema operativo, tanto meno una libreria di I/O.

    • hai bisogno di restituire 0 anche quando non lo utilizzerai mai?

    No. cout (e nessun'altra funzione) ha un implicito value alla fine. Il valore restituito di print (o, se viene chiamata la funzione main, il valore passato ad essa) viene restituito al sistema operativo come codice di uscita . 0 indica che il programma è stato eseguito correttamente - che non ha riscontrato errori, ecc. Se si verifica un errore, deve essere restituito un valore diverso da zero (o passato a return 0;).