Il qualificatore volatile serve a dire al compilatore che la variabile può essere modificata in modo non determinisctico, quindi non prevedibile in base al programma, da qlcosa di esterno, come per esempio un altro processo, il sistema operativo, o un dispositivo hardware. Se ad esempio scrivi un ciclo in cui testi continuamente il valore di una variabile, il compilatore può effettuare delle ottimizzazioni sul codice, inserendo la variabile in un registro in memoaira, in modo da renderene più veloce l'accesso. Se pero il valore della variabile, che si trova in un determinato indirizzo di memoria, viene copiato in un registro, e ogni volta che si accede alla variabile nekl programma si legge nel registro anczicchè nella locazione originaria della variabile, non si potranno vedere l emodifiche che occorrono, perche ad esempio un dispositivo o un latro processo, accede all'indirizzo della variabile in memoria cambiandola, ma il programma continua a leggere il valore originario, che per ottimizzare il tutto era stato messo in un registro. Ovviamente il compilatore non ottimizza a caso, ma solo quando esaminando le istruzioni si desume che le istruzioni stesse non modificano la variabile; per ccui il suo valore puo essere prelevato la prima volta e conservato in un registro. Il tutto funziona appunto se la variabile non è mdificata anche da agenti esterni al programma, se ciò e il caso allora bisogna dichiararla volatile per impedire che il compilatore effettui delle ottimizzazioni.

Quanto alle variabili statiche, esse se sono variabili locali ad una funzione, dichiarandole statiche è come se divenissero globali, ma visibili solo all'interno della funzione in cui sono dichairate. Una variabile statica locale ad una particolare funzione è inizializzata una sola volta, la prima volta che tale funzione viene chiamata e il suo valore resta inalterato quando si esce dalla funzione, per cui quando si richiama nuovamente la funzione tale variabile ha ancora il valore assegnatogli precedentemente. SE dichiari static una variabile globale, si ottiene invece che la variabile sarà globale solo nel file di definizione, ma non sarà visibile in altri files.