sabato 24 novembre 2012

Precedenze degli operatori del linguaggio C


La seguente tavola delle precedenze degli operatori in C dovrebbe essere sempre a portata di mano. Soprattutto quando si sta imparando il linguaggio di programmazione. Ma, anche i più esperti potranno trarre beneficio dall'avere riassunti in una unica tabella tutti gli operatori con le loro precedenze e associatività (= ordine di precedenza che viene seguito quando si trovano più operatori di uguale precedenza nella stessa espressione).


Operatore
Descrizione
Associatività
( )
[ ]
.
->
++ --
Parentesi (chiamata a funzione) (vedi Nota 1)
Parentesi quadre (array)
selezione di membri di oggetti dal nome
come sopra, ma dal puntatore
incrementi/decrementi postfissi (vedi Nota 2)
da sx a dx

++ --
+ -
! ~
(type)
*
&
sizeof
incrementi/decrementi prefissi
più/meno unari
negazione logia/complemento bit a bit
cast (conversione di tipi)
deferenza
indirizzo (di operandi)
dimensioni in byte (dipendente dalla piattaforma)
da dx a sx
*  /  %
moltiplicazione/divisione/modulo
da sx a dx
+  -
Aaddizione/sottrazione
da sx a dx
<<  >>
shift a sinistra/destra bit a bit
da sx a dx
<  <=
>  >=
operatori relazionali minore di/minore o uguale a
operatori relazionali maggiore di/maggiore o uguale a
da sx a dx
==  !=
operatore relazionale uguale a/ non uguale a
da sx a dx
&
AND bit a bit
da sx a dx
^
OR esclusivo bit a bit
da sx a dx
|
OR bit a bit
da sx a dx
&&
AND logico
da sx a dx
| |
OR logico
da sx a dx
? :
condizionale ternario
da dx a sx
=
+=  -=
*=  /=
%=  &=
^=  |=
<<=  >>=
assegnazione
assegnazione con addizione/sottrazione
assegnazione con moltiplicazione/divisione
assegnazione con modulo/AND bit a bit
assegnazione con OR esclusivo bit a bit/Or  bit a bit
assegnazione con shift a sinistra/shift a destra bit abit
da dx a sx
,
virgola (separatore di espressioni)
da sx a dx


Nota 1:Le parentesi sono usate anche per raggruppare sottoespressioni per forzare le precedenze. Nel caso di parentesi nidificate, l'ordine di precedenza è dalla più interna alla più esterna.

Note 2:Gli operatori di incremento postfissi hanno alta precedenza, ma l'incremento7decremnto reale è rimandato fino alla fine della valutazione dell'espressione. Ad esempio nell'esecuzione di a=3*i++, se i valeva 1 prima di questa istruzione,  a varrà 3 e i varrà 2. Cioè i è incrementato al termine dell'esecuzione dell'istruzione.

mercoledì 21 novembre 2012

Simple linked list o liste concatenate semplici (parte II)


Se chiedete a 10 programmatori diversi : "Quali funzioni servono per gestire le liste?", probabilmente otterreste 10 risposte diverse, perché dipende dall'applicazione e dalle strutture dati complesse che si intendono implementare con le liste. Quindi, senza la pretesa di essere esaustivi, analizziamo insieme alcune funzioni di "base" per la creazione, modifica, stampa ed eliminazione di liste. In particolare, in questa piccola serie di post sulle liste collegate semplici, vedremo le seguenti funzioni:


void push(int pl, nodeP *sP, nodeP *eP);
void pop(int *pl,  nodeP *sP, nodeP *eP);
void delnode(int pl, int global, nodeP *sP, nodeP *eP);
void genlist(int N, nodeP* sP, nodeP* eP);
void destroy(nodeP *sp);
void printlistv(nodeP head);
void printlisto(nodeP head);

sabato 17 novembre 2012

Come si misura ill tempo di esecuzione di un blocco di codice C?

Misurare le performance di un frammento codice o di una funzione può essere utile per valutare le prestazioni (benchmarcking) del proprio codice o per decidere tra diversi approcci per la soluzione di un certo problema qual'è il più veloce. In un precedente post, abbiamo visto come misurare il tempo di esecuzione di un eseguibile utilizzando il comando Unix Time, disponibile anche su Windows in CigWin. Invece, per misurare la velocità di esecuzione di un frammento di codice all'interno di un programma scritto in C si può usare la funzione clock(), il cui prototipo si trova in <time.h>.
La funzione clock() restituisce il numero di cicli di clock dall'ultima chiamata della funzione. In <time.h> c'è anche una costante chiamata CLOCK_PER_SEC che fornisce il numero di clock per secondo per la piattaforma hardware e software che si sta usando.