Skip to content

Operatori Fondamentali

Le Espressioni sono calcoli che producono risultati ed effetti collaterali (side effects). Contengono Operandi e Operatori. Il C++ offre una vasta gamma di operatori predefiniti per lavorare su tipi fondamentali e puntatori.

Il C++ distingue gli operatori logici classici (che agiscono sui valori booleani producendo true o false) da quelli operanti “a livello di bit” (bitwise) usati spessissimo per la manipolazione raw dei registri hardware e maschere binarie:

OperatoreNomeEsempioRisultato (Binario / Bool)
&Bitwise AND0b1100 & 0b10100b1000
|Bitwise OR0b1100 | 0b10100b1110
^Bitwise XOR0b1100 ^ 0b10100b0110
~Bitwise NOT~0b10100b0101
<<Left Shift0b0011 << 20b1100
>>Right Shift0b1010 >> 10b0101
&&Logical ANDtrue && falsefalse
||Logical ORtrue || falsetrue
!Logical NOT!truefalse

Gli operatori aritmetici binari classici (+, -, *, /, %) portano con sé una regola spesso dimenticata: la Promozione Intera (Integer Promotion).

Se stai sommando due char o due short, i due operandi vengono tacitamente “promossi” a tipo int prima dell’operazione. Questo per adattare il calcolo ai registri nativi della CPU ed evitare che piccoli calcoli intermedi sfocino in pericolosi e impercettibili overflow. Se uno dei due operandi è in virgola mobile (float o double), l’altro viene promosso al formato più capiente.

  • L’Operatore Ternario (x ? y : z): Zucchero sintattico (o noto scherzosamente come l’Operatore Elvis ?:) per compattare gli if/else. Se x è vera ritorna y, altrimenti z.
  • L’Operatore Virgola (,): Retaggio obsoleto del C, permette di unire più istruzioni. Valuta tutto da sinistra a destra e restituisce l’ultimo valore. (Es. x = 9, x++, x / 2;). Evitalo perché genera orrenda confusione visiva.

Precedenza e Ordine di Valutazione (Evaluation Order)

Section titled “Precedenza e Ordine di Valutazione (Evaluation Order)”

La Precedenza stabilisce in base a quale ordine gli operatori “legano” (bind) i loro operandi. Ovviamente * ha la precedenza rispetto al +. Ma l’Ordine di Valutazione (chi viene eseguito prima a runtime) in C++ è NON SPECIFICATO.

Se scrivi: auto res = stop() + drop() + roll(); Il C++ non garantisce in nessun modo che stop() venga eseguita per prima. Il compilatore è autorizzato a stravolgere l’ordine per spremere performance. Se queste tre funzioni interagissero tra loro producendo side-effects, potresti incorrere in un bug subdolo e impredicibile.

L’unico operatore che forza una valutazione garantita da sinistra a destra è l’AND/OR logico (&& / ||), a causa del meccanismo di corto-circuito (short-circuit).