è probabile ispirato dalla sintassi della dichiarazione nulla di Ada:
while condition loop
null;
end loop;
Ada utilizza la parola chiave null
sia per la costante puntatore nullo e per l'istruzione nulla (e poche altre cose).
Ha alcuni vantaggi rispetto all'istruzione Null di C, che è solo un punto e virgola. In particolare, è molto più esplicito. Un errore abbastanza comune nel codice C è quello di inserire una dichiarazione accidentale nullo aggiungendo una virgola, in particolare tra inesperti programmatori C che non hanno ancora elaborati dove virgola sono necessari e dove non sono:
while (condition);
{
/* statements */
}
Senza il punto e virgola, le istruzioni sono controllate dal ciclo while. Con esso, il corpo del ciclo while è vuoto e il loop è probabilmente infinito se la condizione non ha effetti collaterali.
D'altra parte, se si desidera veramente un'istruzione nulla, l'uso di un punto e virgola può lasciare il lettore a chiedersi se qualcosa è stato ignorato involontariamente.
In C, NULL
è una macro che si espande a una costante di puntatore nullo definita dall'implementazione.L'autore sta usando qui:
while(*pchTo++ = *pchFrom++)
NULL;
come una sorta di dichiarazione di nulla - che funziona in realtà, perché l'espressione seguita da un punto e virgola è un'espressione dichiarazione in cui la dichiarazione viene valutata per i suoi effetti collaterali. Dal momento che non ha effetti collaterali, non fa nulla; si comporta proprio come una dichiarazione nulla vero:
while(*pchTo++ = *pchFrom++)
;
altra forma equivalente:
while(*pchTo++ = *pchFrom++)
42;
A mio parere, questo è ben inteso, ma una cattiva idea. È facilmente riconoscibile per quei pochi di noi che hanno familiarità con C e Ada, ma i programmatori C più esperti la guarderanno e si chiederanno cosa diavolo ci fa la costante del puntatore nullo.
Non è abbastanza così male come la definizione di un insieme di macro per rendere aspetto C come la sintassi di un'altra lingua:
#define IF if (
#define THEN)
#define BEGIN {
#define END }
#define ELSE } else {
ma è con lo stesso spirito.
Il mio consiglio: non fare questo genere di cose. Se vuoi che il tuo codice C sia facilmente comprensibile dai lettori che conoscono C, scrivi un codice C idiomatico; non inventare trucchi intelligenti per far sembrare qualcos'altro. Le dichiarazioni nulle possono essere fonte di confusione, portando il lettore a chiedersi se qualcosa è stato lasciato fuori per caso. La migliore soluzione che, IMHO, è di utilizzare un commento:
while(*pchTo++ = *pchFrom++) {
/* empty body */
}
Separa il punto e virgola dalla condizione del ciclo. (È un codice morto.) –
E un tale libro si chiama "Scrivere codice solido"? – duDE
Se questa pratica è desiderabile è aperta al dibattito, ma un libro che usa tale costrutto senza dedicare almeno un breve paragrafo a spiegare la motivazione mi sembra un buon libro ... –