C vs. C++: differenze e somiglianze

C++ eredita molto da C, e sebbene sia prevalente nello sviluppo di applicazioni e giochi per computer, C rappresenta un’ottima porta d’accesso al mondo della programmazione, specialmente per i neofiti. Scopriamo insieme il perché.

Che cos’è il linguaggio C?

C è un linguaggio di programmazione di tipo strutturale e di alto livello. I programmi creati in C si distinguono per la loro portabilità. La sua robustezza lo rende uno dei linguaggi di programmazione più validi e diffusi, impiegato nella realizzazione di sistemi embedded, driver, kernel, applicazioni di sistema, sistemi operativi (come Microsoft Windows e Apple OS X), database (come MySQL) e svariati applicativi IoT.

C è un linguaggio che viene compilato, introducendo un livello di astrazione tra il codice macchina e il programma.

Un semplice programma in C, pensato per sommare due numeri, potrebbe essere strutturato nel modo seguente:

#include<stdio.h>
int main()
{
int a, b, sum;
printf("Inserisci due numeri da sommare: ");
scanf("%d%d", &a, &b);
sum = a + b;
printf("nLa somma di %d e %d è %d", a, b, sum);
return 0;
}

Questo è l’output che ne risulta:

Output di un programma C di esempio

I programmi C includono l’intestazione stdio.h, che gestisce l’input e l’output standard.

STDIO mette a disposizione le funzioni basilari di input/output, come printf e scanf. La funzione printf serve a visualizzare dati (come messaggi e output) sulla console, mentre scanf riceve input dalla stessa. In questo contesto, %d indica che i numeri gestiti sono di tipo intero.

Se si utilizzassero valori decimali, si otterrebbero risultati inaspettati. Per evitarlo, si può ricorrere a %f. La funzione main() è la prima ad essere eseguita durante l’avvio del programma. La sintassi è basilare: si dichiarano i tipi di variabili e poi le si usa.

Che cos’è il C++?

C++ si fonda sui concetti della programmazione a oggetti, come l’astrazione, il polimorfismo, l’ereditarietà e l’incapsulamento. C++ può essere visto come un’estensione di C, arricchita dalla nozione di classi e oggetti.

L’uso di oggetti per l’archiviazione di dati ha introdotto un livello di organizzazione superiore nei programmi. Ad esempio, per memorizzare i dati relativi a uno studente, si può creare una classe Studente, includendo attributi come nome, età, hobby, voti, e così via. È possibile creare un’istanza di studente ogni qualvolta sia necessario!

class Student {
public: 
char name[20];
int age;
float marks;
};

//Questo crea un oggetto
Student student1 = new Student();

In pratica, l’oggetto verrà creato, e la memoria allocata, solo durante l’esecuzione del programma.

C++ garantisce prestazioni elevate, motivo per cui continua ad essere la scelta principale per lo sviluppo di motori grafici, sistemi embedded, browser, compilatori e applicazioni di elaborazione grafica e immagini.

Diversi database, come MongoDB, sono scritti in C++. Analogamente a C, anche C++ è portabile.

Rielaboriamo il nostro programma di addizione in C++, notando le diverse funzioni coinvolte:

#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "Inserisci i numeri: "; 
cin >> a >> b;
int sum = a + b;
cout << a << " + " << b << " = " << sum;
return 0;
}

Si noti l’uso di cout e cin al posto di printf e scanf. Inoltre, le dichiarazioni di tipo possono avvenire in qualsiasi punto del programma, purché la variabile sia dichiarata prima del suo uso (come nel caso di sum). La stampa del risultato è immediata, con l’uso diretto dei nomi delle variabili. Si noti l’uso dello spazio dei nomi std, definito nell’intestazione iostream. std contiene metodi quali cout, cin e altri.

Analogie tra C e C++

C si può considerare un sottoinsieme di C++. Ci sono diverse somiglianze tra C e C++, sia per quanto riguarda la scrittura dei programmi, sia per gli ambiti di utilizzo. Entrambi sono robusti, portabili e offrono prestazioni elevate. Alcune delle somiglianze principali sono:

N. Caratteristica Spiegazione
1. Sintassi Condividono una sintassi simile, per esempio nella dichiarazione delle variabili, nell’uso del punto e virgola alla fine delle righe e nelle convenzioni di denominazione.
2. Struttura e Procedura Ogni riga di codice viene eseguita una dopo l’altra. I programmi sono strutturati con le importazioni iniziali, le dichiarazioni di variabili e poi il codice principale.
3. Funzione Main() L’esecuzione del codice avviene all’interno della funzione main(). main() è la prima funzione invocata all’avvio del programma.
4. Puntatori Sia C che C++ usano i puntatori in modo analogo. Un puntatore è una variabile che memorizza l’indirizzo di memoria di un’altra variabile. Ad esempio, int a = 1;. A seguito di questa istruzione, viene allocata una zona di memoria (per esempio, XX0011) per a. Si può accedere a questa zona di memoria tramite l’operatore &, come in int ptr_a = &a;.
5. Parole chiave e operatori Tutte le parole chiave e gli operatori di C sono validi anche in C++. Ad esempio, scope, static, public, int, ecc. C++ mette a disposizione ulteriori parole chiave e operatori.

Somiglianze tra C e C++

Differenze tra C e C++

C++ è nato con l’obiettivo di superare alcune limitazioni di C e, di fatto, lo estende. Pertanto, un programma scritto in C è valido anche in C++, ma non è vero il contrario! La principale differenza è che C++ è orientato agli oggetti (OOP). Inoltre, C++ pone una maggiore attenzione sul controllo del tipo. Altre differenze più sottili sono:

C C++
Sviluppato tra il 1969 e il 1973 da Dennis Ritchie presso i laboratori AT&T Bell. Sviluppato da Bjarne Stroustrup nel 1979.
Non segue i principi della programmazione orientata agli oggetti. Si basa sui concetti della programmazione orientata agli oggetti, come incapsulamento, polimorfismo ed ereditarietà.
C include un totale di 32 parole chiave come char, switch, int, static, union, etc. Tutte le parole chiave di C sono valide in C++, con 31 parole chiave aggiuntive.
Supporta solo la programmazione procedurale. C++ supporta molteplici paradigmi di programmazione, come OOP, programmazione generica e funzionale.
Non si possono implementare funzioni OOP in C. Funzionalità come le classi friend e le funzioni virtuali in C++ migliorano le capacità OOP.
C supporta i tipi di dati predefiniti. C++ supporta sia i tipi di dati predefiniti che quelli definiti dall’utente mediante il concetto di classi.
Non prevede l’overloading di operatori o funzioni. C++ supporta sia l’overloading di operatori che di funzioni (polimorfismo).
L’allocazione di memoria avviene tramite le funzioni malloc() e calloc(), e la deallocazione tramite free(). L’allocazione di memoria avviene tramite l’operatore new, e la deallocazione tramite l’operatore delete.
C non supporta la gestione delle eccezioni. C++ supporta la gestione delle eccezioni.
Si concentra sulla procedura o sul metodo, più che sui dati. Ha una maggiore attenzione sui dati.

Differenze tra C e C++

Altre importanti funzionalità presenti solo in C++ sono:

  • Tramite la parola chiave namespace, è possibile creare variabili con lo stesso nome in namespace diversi.
  • È possibile usare funzioni all’interno delle struct. Le strutture possono avere modificatori di accesso.
  • Supporta variabili di riferimento.

Quando usare C o C++

È frequente tra i programmatori il quesito: perché dovrei imparare C quando posso fare tutto in C++?

Lo studio di C consente di acquisire una base solida su strutture dati, puntatori, parole chiave, concetti di stack, heap e gestione della memoria.

Inoltre, C è ancora molto usato per app ad alte prestazioni, dato che il compilatore C è più veloce del compilatore C++. Pertanto, se si devono sviluppare blocchi di codice che non necessitano di oggetti e classi, funzioni virtuali o template, C è preferibile, mentre C++ potrebbe essere eccessivo con le sue vaste librerie.

La maggior parte dei codici di basso livello (come kernel, sistemi operativi e database) è ancora mantenuta in C, quindi conoscerlo aiuta ad imparare C++ più velocemente.

C++ è ritenuto uno dei linguaggi più veloci ed efficienti, ed è per questo che continua ad essere uno dei migliori linguaggi, soprattutto per applicazioni ad alte prestazioni come motori grafici, dispositivi IoT e app desktop. Molte applicazioni usano una combinazione di codice C e C++ per raggiungere prestazioni ottimali e sfruttare i vantaggi della programmazione orientata agli oggetti.

Riepilogo

In questo articolo, abbiamo esplorato le basi di C e C++, con un semplice esempio. Abbiamo evidenziato le somiglianze e le differenze principali, indicando anche i casi in cui è preferibile l’uno o l’altro.

Se stai muovendo i primi passi nel mondo dello sviluppo software, iniziare con C può darti un vantaggio, dato che è semplice e copre i concetti fondamentali della programmazione, come strutture dati, puntatori, memoria, e così via.

Potrebbe interessarti l’uso del compilatore C online e del compilatore C++ di winadmin.it.