Siccome conosco il C e il C++ da 17 anni, non saprei fornirti una buona guida. Io avevo studiato su un libro del C++ che ormai è datatissimo (il C++ è stato quasi completamente rivoluzionato nel 2011) e avevo pian piano scoperto le differenze con il C. Lo standard del 2011 del C, seppur sia stato meno rivoluzionario di quello del C++, è stato recepito in maniera positiva (al contrario di quello del 1999) quindi la maggior parte dei libri attuali lo useranno (o per lo meno non si preoccuperanno di un paio di limitazioni dell'ANSI C che venivano considerate antiquate già quando ho imparato il C io). Molti amanti del C considerano "
The C Programming Language" (Second Edition) di Brian Kernighan e Dennis Ritchie come il libro su cui si dovrebbe studiare il C. Sinceramente io non l'ho usato e trovo il fatto che non sia stato aggiornato alle nuove versioni del linguaggio in grosso limite. Per esempio, il libro non terrà sicuramente conto del fatto che alcune funzioni di I/O sono attualmente deprecate, rimosse o comunque considerate poco sicure.
L'istruzione per il preprocessore
#undef
serve ad annullare un
#define
. La puoi ignorare.
Riguardo alla matrice/array multidimensionale, sì è una matrice/array multidimensionale. L'uso base lo puoi vedere lì. Di fatto non è altro che un array di array. Il mio comunque era solo un esempio, si può stampare direttamente il risultato a video invece di memorizzarlo oppure mettere due cicli non annidati all'interno del ciclo delle rette e memorizzare gli y per le varie rette in maniera indipendente.
Riguardo alle parentesi graffe, penso possa essere utile una spiegazione un po' più dettagliata. Una istruzione composta (spesso detta blocco di codice) consiste in una sequenza di definizioni e istruzioni racchiuse tra parentesi graffe. In generale, puoi mettere istruzioni composte ogni qual volta puoi usare istruzioni semplici (insomma una espressione seguita da ; ). Un esempio di questo "scambio" lo puoi vedere con if, for, switch, while e do.
Per capirci
- Codice:
for( i = 0; i < 3; i++ )
printf( "1" );
printf( "2" );
stampa a video "1112" (non ho indentato i due printf per non creare confusione), mentre
- Codice:
for( i = 0; i < 3; i++ )
{
printf( "1" );
printf( "2" ):
}
stampa "121212".
Una differenza tra C89 e gli standard successivi è che questi ultimi permettono di ordinare definizioni/dichiarazioni e istruzioni in qualsiasi ordine all'interno del blocco. Nel C89, le definizioni/dichiarazioni devono/dovevano precedere ogni istruzione.
Una cosa importante da sapere sulle istruzioni composte è che ogni variabile dichiarata in quell'istruzione è visibile SOLO all'interno del blocco stesso. In un certo senso puoi pensare che quella variabile viene creata nel momento in cui viene definita e poi distrutta alla fine del blocco. A livello professionale, definire le variabili solo quanto ti servono esplicitamente e restringere il loro "scope" il più possibile è considerata una buona prassi (da una parte aiuta il compilatore a capire quando non hai più bisogno di qualcosa e dall'altro evita alcuni errori che possono capitare quando recicli variabili). Nel mio esempio precedente, stavo evitando di riutilizzare gli indici dei cicli. Nota che con gli standard successivi al C89, è possibile definire variabili direttamente nella fare si inizializzazione del for.