La serie delle "GUIDE DEFINITIVE" è un progetto creato in parte per scherzo e in parte per aiutare chi ne ha bisogno. Se riscontri problemi, errori o simili, puoi inviarmi un messaggio su Telegram tramite (@clipwav), cercherò di rispondere il prima possibile!
Il linguaggio di programmazione C è uno dei linguaggi di programmazione più potenti disponibili, si tratta di un linguaggio compilato, il che lo rende veloce ed efficente, ed è usato principalmente per sviluppare software di basso livello come per esempio:
Possiamo iniziare un nuovo progetto con questo template di partenza, contiene:
#include
, per importare la libreria stdio (input/output)main
, che conterrà tutto il codice che il nostro programma andrà ad eseguirereturn 0
per chiudere il programma una volta completata l'esecuzioneI commenti sono solitamente utilizzati per fornire una descrizione del codice sorgente.
Non vengono elaborati dal compilatore e non hanno alcun effetto sul funzionamento del programma.
Iniziano con il carattere \
e proseguono fino alla fine della linea
Esempio in C:
Le variabili sono degli spazi di memoria che vengono usati per memorizzare i dati. Ogni variabile ha un nome e un tipo. Il nome della variabile serve per identificarla, mentre il tipo determina il tipo di dati che può memorizzare.
In C, le variabili possono essere di diversi tipi, per esempio ecco alcune variabili di tipo semplice:
Per indicare che il valore assegnato è un carattere dobbiamo metterlo all'interno di virgolette (""
) oppure apici (''
).
⚠️ Ogni variabile semplice può contenere un singolo valore alla volta.
Questo significa assegnare loro un nome, un tipo ed opzionalmente un valore.
🚨 In C non esistono le variabili di tipo boolean
Cosa sono?
Le variabili booleane possono contenere uno di due valori, vero oppure falso.
Come faccio se non posso usarle in C?
Usiamo gli int
, qualunque valore diverso da 0 ritorna vero all'interno dei if
Esempio:
In alternativa possiamo importare #include<stdbool.h>
in cima al documento per poter utilizzare il tipo di variabile bool
Esempio:
Per dichiarare una variabile di tipo intero si può utilizzare la seguente sintassi:
In questo modo si sta dicendo al compilatore che si vuole creare una variabile di nome "numero", con tipo "int" e valore uguale a 5.
Esistono anche variabili di tipo derivate, come ad esempio:
Possiamo vedere un array come un cassetto che contiene più elementi dello stesso tipo, posso avere più cassetti che possono contenere un insieme predefinito di oggetti dello stesso tipo
Functions: una funzione è un insieme di istruzioni che vengono eseguite in un determinato ordine e che possono restituire un valore. Ogni funzione ha un nome, che serve a identificarla, e può avere uno o più parametri, che sono i valori che vengono passati alla funzione quando viene eseguita.
Pointers: un puntatore è una variabile che contiene l'indirizzo di un'altra variabile. I puntatori possono essere di diversi tipi, a seconda del tipo di variabile a cui fanno riferimento.
Struct: una struttura è un insieme di variabili di diversi tipi, disposte in un ordine specifico. Ogni variabile all'interno della struttura è identificata da un nome, che serve a identificarla.
Per più informazioni sulle variabili, controlla il seguente [Link]
gli lvalue sono contenitori per valori assegnabili. Ciò significa che possono essere utilizzati per assegnare valori ad altri lvalue. Un lvalue può essere una variabile, una costante o un'espressione che punta a una locazione di memoria.
Esempio:
In poche parole, l'lvalue è il nome che diamo ad un espressione, quale variabile, funzione, etc.
le espressioni che vengono rappresentate senza un dichiarare l'oggetto, sono chiamati rvalues
Un rvalue è un espressione che può apparire sul lato destro di un operatore d'assegnamento (=) ma non a sinistra di esso
Esempio:
Un puntatore è una variabile che contiene l'indirizzo di memoria di un altro oggetto, invece che il valore dell'oggetto stesso. I puntatori vengono utilizzati per gestire la memoria dinamica e per creare funzioni che possono modificare gli oggetti a cui fanno riferimento.
Per utilizzare i puntatori in C, è necessario dichiarare una variabile puntatore con l'operatore "*" seguito dal nome della variabile. Ad esempio:
Questo dichiara un puntatore chiamato "ptr" che può fare riferimento a un oggetto di tipo "int". Per assegnare un indirizzo di memoria a un puntatore, si utilizza l'operatore di indirizzo "&" davanti alla variabile cui si vuole fare riferimento. Ad esempio:
In questo esempio, il puntatore "ptr" viene assegnato all'indirizzo di memoria della variabile "x". Per accedere al valore di un oggetto a cui fa riferimento un puntatore, si utilizza l'operatore di dereferenziazione "*". Ad esempio:
Sono un concetto potente e versatile che viene utilizzato in molti aspetti del linguaggio C.
Le strutture in C sono un modo per raggruppare diverse variabili di tipo diverso in un unico oggetto.
Viene definita dall'utente e può contenere variabili di qualsiasi tipo, come interi, caratteri e puntatori. Le strutture vengono utilizzate per creare strutture dati come liste e alberi.
Per definire una struttura in C, si utilizza la keyword "struct" seguita dal nome della struttura e dalle variabili che essa contiene, racchiuse tra parentesi graffe. Ad esempio:
Questo definisce una struttura chiamata "Persona" che contiene tre variabili: una stringa di caratteri chiamata "nome", un intero chiamato "eta" e un float chiamato "altezza".
Una volta definita una struttura, si può creare un oggetto di quel tipo usando la keyword "struct" seguita dal nome della struttura e dal nome dell'oggetto. Ad esempio:
Questo crea un oggetto di tipo "Persona" chiamato "p1". Per accedere alle variabili all'interno di un oggetto di tipo struttura, si utilizza il simbolo "." (punto). Ad esempio:
In questo esempio, vengono assegnati valori alle variabili all'interno dell'oggetto "p1" di tipo "Persona".
Le strutture possono essere utilizzate per creare strutture dati come liste e alberi. Ad esempio, si può creare una lista di oggetti di tipo "Persona" utilizzando un puntatore a un oggetto di tipo "Persona" come variabile all'interno della struttura. Ad esempio:
In questo esempio, la struttura "Persona" viene modificata per includere un puntatore a un altro oggetto di tipo "Persona" chiamato "next". Questo può essere utilizzato per creare una lista di oggetti di tipo "Persona" in cui ogni oggetto punta al successivo nella lista.
printf()
printf()
è una funzione che permette di "stampare" del testo nella console d'output del programma (di solito il terminale).Esempio:
In questo caso, la "%d" viene utilizzata per indicare al compilatore che si vuole stampare un valore di tipo intero.
printf
disponibili:
%c - carattere
%d - numero decimale (intero) (base 10)
%e - numero esponenziale float
%f - numero float
%i - numero intero (base 10)
%o - numero ottale (base 8)
%s - una stringa di caratteri
%u - numero decimale (intero) senza segno
%x - numero in esadecimale (base 16)
%% - stampa un segno di percentuale
\% - stampa un segno di percentuale
if
L'operatore if if
permette di eseguire o non eseguire un blocco di codice a seconda dell'esito (vero o falso) del valore specificato all'interno delle parentesi.
Esempio:
=
Assegna un valore, quindi per esempio int numero = 2
==
Esegue una comparazione tra due valori a == b
for
LoopIl for
loop è utilizzato per eseguire un blocco di codice un certo numero di volte.
Di seguito è riportato un esempio di codice che utilizza un for
loop per stampare i numeri da 1 a 5:
In questo esempio, la variabile i
viene inizializzata a 1.
Il blocco di codice all'interno del for
loop verrà eseguito 5 volte (fino a quando i <= 5
non sarà falso), con la variabile i
che assumerà i valori 1, 2, 3, 4 ed infine 5 (i
inizia da 1).
i
all'interno del ciclo for, il valore cambierà ad ogni ciclo
(non deve essere per forza chiamata "i", possiamo assegnargli un nome a piacere)
while
LoopIl ciclo while
è un tipo di ciclo che esegue un blocco di istruzioni fino a quando una condizione è vera.
La sintassi del ciclo while
è la seguente:
Esempio:
do while
LoopIl do while
loop è un tipo di loop che esegue il codice all'interno del suo blocco almeno una volta, prima di verificare la condizione di uscita.
Ciò significa che il codice all'interno del blocco do while
verrà eseguito almeno una volta, anche se la condizione di uscita è falsa.
Ecco un esempio di come utilizzare un do while
loop:
In questo esempio, stampa il valore di i
sullo schermo e quindi incrementa i
di 1.
Ciò verrà ripetuto fino a quando i
non sarà uguale a 10.
Switch
Gli switch
è una struttura di controllo che consente di eseguire un blocco di codice specifico in base al valore di un'espressione.
L'espressione viene valutata e il valore viene confrontato con un elenco di valori noti come "case".
Se il valore corrisponde a uno dei case, viene eseguito il codice assegnato a quel case. Altrimenti, viene eseguito il codice assegnato all'opzione "default".
Ecco un esempio di come funzionano gli switch
:
Break
Il break
è un'istruzione che interrompe l'esecuzione di un loop.
Esempio:
Return
Il return
è una keyword utilizzata per indicare la fine di una funzione e la restituzione di un valore.
Esempio:
Nell'esempio sopra, la funzione somma prende in input due numeri interi e restituisce la loro somma.
Continue
Continue
è un'istruzione che indica al compilatore di ignorare il resto del codice all'interno di un ciclo e di passare direttamente all'iterazione successiva.
Ecco un semplice esempio di come funziona:
In questo esempio, il valore 5 verrà ignorato e la stampa sarà la seguente: emmet selection0 1 2 3 4 6 7 8 9
Mettiamo i concetti spiegati fino ad ora in pratica!
Crea un programma scritto in C che esegue le seguenti istruzioni:
int
di nome numero
numero
(140, 420, 69)numero
è superiore a 100, se è maggiore di 100 stampa un messaggio in output che dice "il numero è maggiore di 100!", altrimenti stampa "il numero è minore di 100!"In C esistono diversi operatori per compiere calcoli matematici o controlli, ecco una breve lista con tutti gli operatori principali:
Operatore | Significato | Esempio | Dettagli |
---|---|---|---|
= | Il singolo uguale indica "imposta il valore a…" | int a = 5 |
Imposta il valore di una variabile |
== | è uguale a… (viene usato nei controlli) | a == b |
controlla se il valore a equivale al valore b , se sono uguarli ritorna 1 (Vero) altrimenti ritorna 0 (Falso) |
&& | and (e), usato per verificare se due condizioni sono entrambi vere | x && y |
Se entrambe gli operandi sono diversi da 0 (Falso) ritorna 1 (Vero) |
|| | or (oppure), usato per verificare se almeno una delle due condizioni è vera | x || y |
Se almeno un operando è diverso da 0 (Falso) ritorna 1 (Vero) |
!= | not equal to (non uguale a), usato per verificare il contrario di una condizione | x != y |
se x è diverso da y, l'operatore ! può anche essere usato per verificare se una condizione è falsa (if(!inseritoNumero){} ), "!" può essere letto come "non" |
>[=] | maggiore [uguale (opzionale)] | x > y |
|
<[=] | minore [uguale (opzionale)] | x < y |
||
è vero il secondo non viene eseguito, quindi se per esempio abbiamo 1 || ++b
, ++b
non verrà eseguito dato che 1
è già vero, rendendo l'||
vero, stesso concetto si applica per il &&
quando uno dei due valori è falso
Operatore | Significato | Esempio | Dettagli |
---|---|---|---|
++ | somma + 1, è l'equivalente di x = x+1 |
x++ |
posso inserire il "++" prima o dopo la variabile, cambia funzionalità in base al contestoa = b++ | a viene impostato a b e poi viene aggiunto 1 a ba = ++b | prima viene fatto b+1 , poi viene impostato il risultato di b ad a |
– | sottrazione di 1, è l'equivalente di x = x-1 |
x-- |
posso inserire il "–" prima o dopo la variabile, cambia funzionalità in base al contestoa = b-- | a viene impostato a b e poi viene aggiunto 1 a ba = --b | prima viene fatto b-1 , poi viene impostato il risultato di b ad a |
+ | semplice somma tra 2 o più variabili/numeri | x + y |
|
- | semplice sottrazione tra 2 o più variabili/numeri | x - y |
|
* | semplice moltiplicazione tra 2 o più variabili/numeri | x * y |
|
/ | semplice divisione tra 2 o più variabili/numeri | x / y |
|
% | modulo, restituisce il resto tra 2 numeri | x % y |
Quando si scrive una funzione, si specifica il tipo di dati che la funzione restituisce (come per esempio un numero intero [int
], una stringa di caratteri [char *
], ecc.), seguito dal nome della funzione ed infine, tra parentesi tonde, si specificano i parametri che la funzione accetta.
Esempio:
Questa funzione, chiamata "somma", accetta due parametri di tipo "int" e restituisce un valore di tipo "int". La funzione esegue semplicemente la somma dei due parametri e restituisce il risultato.
Questa funzione può essere utilizzata all'interno di un programma in questo modo:
Nell'esempio precedente, la funzione "somma" viene chiamata all'interno del "main", passando come parametri i valori "x" e "y".
La funzione esegue la somma dei due parametri e restituisce il risultato, che viene assegnato alla variabile "z".
Nota dell'autore: questa parte è da riscrivere
Un espressione consiste in una sequenza di costanti, identificatori ed operatori che il programmma "calcola" eseguendo le operazioni indicate
Esempio:
Esempio:
a = b + 1;
e a = b++;
compiono due operazioni diverse!
a = b + 1
assegna ad a
il valore di b
+ 1, quindi senza cambiare b
a = b++
prima aggiunge 1 alla variabile b
, e poi assegna il valore ad a
Una espressione ha "effetti collaterali" se modifica uno stato al di fuori del suo ambiente locale.
Quindi è considerato un "effetto collaterale" quando si ha un interazione osservabile con elementi esterni al di fuori di ritornare un valore
Esempio:
Learn More →
Posso assegnare valori solo ad indirizzi di memoria (variabili, per esempio)
2 = a
, "Ciao" = "Addio"
, 15.2 = b
, a + 1 = 2
a = 5
, Ciao = "Ciao"
, numero = 15.351
A sinistra dell'uguale può esserci solamente un valore,
Ogni espressione ha un tipo di valore che viene ritornato alla fine dell'esecuzione
Se un espressione non ha valore, ritorna un valore di tipo void
Esempio:
Mettiamo che a è di tipo int
Espressione | Tipo | Descrizione |
---|---|---|
\n |
int | Carattere che indica "a capo" |
a + 1 |
int | Somma tra due Interi |
a + 1.0 |
double | Somma tra un intero ed un float/double |
a < 77.7 |
int | Ritorna un int che indica se la condizione è "vera" oppure "falsa" |
"A string literal" |
char * | Un Array di caratteri |
abort() |
void | Una funzione |
sqrt(2.0) |
double | Radice quadrata di 2.0 |
In questa sezione aggiungerò concetti base che potrebbero tornare utili
Per convertire un numero decimale (base 10) in esadecimbale (base 16) eseguo la seguente procedura:
Quindi 10 = A, 11 = B, 12 = C, 13 = D, 14 = E, 15 = F
Per convertire un numero esadecimale (base 16) in decimale (base 10) eseguo la seguente procedura:
moltiplichiamo ogni cifra per 16 elevato alla posizione che occupa da destra a sinistra.
Ad esempio, il numero esadecimale "AF" è convertito in decimale come segue:
Per convertire un numero binario (base 2) in decimale (base 10), si moltiplica ogni singolo bit per 2 elevato alla posizione del bit, a partire dal bit meno significativo.
Esempio: