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.
Operatori Logici e Bitwise
Section titled “Operatori Logici e Bitwise”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:
| Operatore | Nome | Esempio | Risultato (Binario / Bool) |
|---|---|---|---|
& | Bitwise AND | 0b1100 & 0b1010 | 0b1000 |
| | Bitwise OR | 0b1100 | 0b1010 | 0b1110 |
^ | Bitwise XOR | 0b1100 ^ 0b1010 | 0b0110 |
~ | Bitwise NOT | ~0b1010 | 0b0101 |
<< | Left Shift | 0b0011 << 2 | 0b1100 |
>> | Right Shift | 0b1010 >> 1 | 0b0101 |
&& | Logical AND | true && false | false |
|| | Logical OR | true || false | true |
! | Logical NOT | !true | false |
Promozione Aritmetica
Section titled “Promozione Aritmetica”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.
Altri Operatori Speciali
Section titled “Altri Operatori Speciali”- L’Operatore Ternario (
x ? y : z): Zucchero sintattico (o noto scherzosamente come l’Operatore Elvis?:) per compattare gliif/else. Sexè vera ritornay, altrimentiz. - 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).