C ha due diverse nozioni: espressioni e dichiarazioni . Verifica leggendo alcuni standard C come n1570 . Si noti che le espressioni sono istruzioni, ma alcune istruzioni (ad esempio while
, switch
, goto
...) non sono espressioni.
Alcune lingue (come Ocaml, Scheme, Lisp, ....) hanno solo espressioni (e non hanno alcun tipo di dichiarazione). In tali lingue la sequenza richiede solo un costrutto. Si noti ad esempio che in Ocaml, il suo ;
è come l'operatore virgola C, e che in Schema begin
è per costruzioni di sequenze (ma accetta molti operandi). Ovviamente dovresti leggere SICP se non l'hai ancora fatto.
L' operatore virgola sta facendo (come operatore condizionale ternario , o binary +
) un'espressione composta (fatta di operandi, che sono sotto-espressioni più semplici).
Il punto e virgola separa due istruzioni all'interno di sequenze di istruzioni (che appaiono in blocchi). Ovviamente si potrebbe (ma questo non è leggibile) separare le espressioni da virgole per renderle una dichiarazione; ma è possibile (e questo è più leggibile) creare una sequenza di istruzioni di espressione.
Both the comma operator and the semicolon can be used to separate statements.
Questo è sbagliato: while(i<10) {i++;}, i
non è un'istruzione C valida -ma entrambe le parti sinistra e destra di ,
sono istruzioni valide (quella giusta, i
, essendo un dichiarazione di espressione ). I compilatori GCC e Clang accettano come estensione espressioni di dichiarazione (per qualche motivo, questa utile funzionalità esiste da più di una dozzina di anni ma non è stato standardizzato.
(Non ne sono sicuro, ma ho sentito che B , l'antenato di C, aveva solo espressioni, quindi la sua while
"istruzione" valutata in -1 quando usata come espressione, potrei sbagliarmi ....)
Preferirei che C avesse solo espressioni, alcune delle quali (come while
) essendo di tipo void
. Ma non è così che il linguaggio di programmazione si è evoluto e ora viene definito. Preferirei anche espressioni di istruzioni e calcolato goto
-s (e qualche altro estensioni fornite da GCC) per far parte dello standard C. Non so perché non sia così! Parte del motivo è che l'essere membro del comitato di standardizzazione C è un lotto di lavoro (quasi un lavoro a tempo pieno) e attività di lobbying e costa molto, in particolare nei viaggi- (e penso che la gente di GCC non avevano abbastanza soldi per quello, quando - nel secolo precedente - introdussero le loro estensioni C).
BTW, dopo aver letto il Dragon Book e approfondito lo studio C11 standard, potresti progettare un linguaggio simile a C che ha solo espressioni (cioè, che mescola le istruzioni in espressioni come vorrei che C facesse ) e implementarlo nel compilatore giocattolo (utilizzando una libreria di generazione di codice esistente come < a href="https://gcc.gnu.org/onlinedocs/jit/"> libgccjit o LLVM o compilandolo in C ). Questo potrebbe rendere interessante un progetto studentesco di semestre (a livello di master). Cerca in lingue accademiche come Terra o Cyclone per l'ispirazione . Si potrebbe anche abbastanza facilmente (semestre di lavoro) patch GCC o Clang per aggiungere un nuovo costrutto: -let chiamalo "l'espressione dell'istruzione vuota" - dove void
seguito da qualche semplice istruzione o blocco di non espressione è una nuova espressione valida di tipo void
(quindi void while(i<10) {i++;}, i
sarebbe un'espressione valida). Avere quell'estensione accettata dalla comunità GCC o Clang è una storia diversa (oggi, entrambe le comunità GCC e Clang non sono amichevoli alle nuove estensioni della lingua).