C ++ contiene l’intero linguaggio C?

Ho letto in tutorial che C ++ contiene l’intero linguaggio di programmazione C.

Comunque ho anche letto, in posti come questo che

Se impari il C ++, alla fine imparerai la maggior parte di C con alcune differenze tra le lingue che imparerai nel tempo.

Quindi la mia domanda è solo questa:

Se conosco molto bene il linguaggio C ++, imparerò il linguaggio C “reale” (senza alcuna “differenza”) perché il linguaggio C90 completo è incluso in C ++ 11?

No, il C ++ non è un superset del linguaggio C. Mentre C ++ contiene una grande parte di C, ci sono delle sottili differenze che possono morderti male dove meno te lo aspetti. Ecco alcuni esempi:

  • C ha il concetto di definizioni provvisorie che non esiste in C ++.
  • C non richiede la conversione esplicita sull’assegnazione di puntatori void a variabili di tipo concreto.
  • C ha regole diverse riguardo alla propagazione const .
  • C ha qualcosa chiamato la “regola implicita int “, che, sebbene abolita con C99, appare alcune volte e deve essere considerata.
  • Il preprocessore C ha alcune funzionalità che il preprocessore C ++ non ha.
  • Il linguaggio C ha due stili di definizione di funzione, stile K & R e stile Stroustrup. C ++ ha solo lo stile Stroustrup.
  • Le regole di lexing per C e C ++ sono diverse senza essere un sottoinsieme dell’altro
  • C e C ++ hanno serie diverse di parole riservate. Ciò può causare errori strani perché un identificatore non è consentito nell’altra lingua.
  • Mentre C ++ ha preso quasi tutte le funzioni da ANSI C (C89), molte funzionalità sono state aggiunte a C nelle successive revisioni standard che non sono disponibili in C ++.
  • C ++ ha una syntax diversa, anche per alcune parti che non sono nuove. Ad esempio, a ? b : c = d a ? b : c = d è un errore di syntax in C ma analizzato come a ? b : (c = d) a ? b : (c = d) in C ++.
  • C garantisce che &*E è esattamente identico a E , anche se E è un puntatore nullo. Il C ++ non ha tale garanzia.
  • In C, una stringa letterale che inizializza una serie di caratteri può inizializzare una matrice che è lunga almeno quanto la stringa senza il byte \0 finale. (es. char foo[3] = "bar" è legale). In C ++, l’array deve essere lungo almeno quanto la stringa includendo il byte \0 finale.
  • In C, un carattere letterale come 'A' ha tipo int . In C ++, ha char .
  • C ha una regola speciale per rendere legale il tipo punning attraverso i sindacati. C ++ manca di questa lingua, rendendo il codice come

     union intfloat { int i; float f; } fi; fi.f = 1.0; printf("%d\n", fi.i); 

    comportamento indefinito.

Se conosco molto bene il C ++, imparerò il linguaggio C “reale” (senza alcuna “differenza”)

Se impari correttamente il C ++, probabilmente non avrai bisogno di usare molte delle tecniche standard usate in C. In teoria potresti programmare quasi tutto C in C ++, con eccezioni che sono già state introdotte. Tuttavia, in realtà, non lo faresti o non dovresti . Questo perché C ++ è un linguaggio diverso che fornisce un insieme di strumenti molto diverso se usato in modo ottimale.

A parte gli elementi di base come la syntax generale e i tipi fondamentali, questi sono due linguaggi in evoluzione separatamente, e dovrebbero essere affrontati (appresi, programmati) come tali.

In termini generali, il linguaggio C ++ è essenzialmente C con un sacco di cose orientate agli oggetti aggiunte. Quasi tutto il codice che potresti scrivere in C verrà anche compilato ed eseguito correttamente in C ++.

Tuttavia, ci sono alcuni angoli delle lingue dove ci sono differenze. Il numero di questi è cresciuto lentamente nel tempo, ma le lingue non stanno cambiando abbastanza rapidamente perché ciò sia un problema significativo.

Se impari solo C ++, allora sì, alla fine imparerai anche quasi tutti gli aspetti del linguaggio C. Se diventi esperto in C ++, sarai in grado di identificare e comprendere i luoghi in cui esistono piccole differenze tra le parti simili di C e C ++.

Non sono sicuro di quali “differenze” potrebbero esistere …

Ad esempio come questo :

In C:
void foo () significa “una funzione che accetta un numero non specificato di argomenti di tipo non specificato”
[…]
In C ++:
void foo () significa “una funzione senza prendere argomenti”

Se impari prima il C ++, sarai in grado di apprendere l’intera libreria C in modo abbastanza semplice. Alcune delle syntax sono leggermente diverse e altre piccole differenze. Come ha detto KerrekSB, un esempio di questo sarebbe il tipo di regole punitive e l’assegnazione implicita da vuoto. Ce ne sono molti altri ma alla fine sarai in grado di imparare questi. Praticamente è come imparare il gergo inglese.