Operatori in C e C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Miglioramento delle traduzioni e aggiunta di ulteriori riferimenti
 
(13 versioni intermedie di 2 utenti non mostrate)
Riga 1:
Questa è una lista degli [[Operatore (informatica)|operatori]] nei [[Linguaggio di programmazione|linguaggi di programmazione]] [[C (linguaggio di programmazione)|C]] e [[C++]]. Tutti gli operatori seguenti sono implementabili in quest'ultimo linguaggio, mentre invece altri non lo sono in C, come nel caso degli operatori di [[conversione di tipo]] (casting), ossia <code>const_cast</code>, <code>static_cast</code>, <code>dynamic_cast</code>, e <code>reinterpret_cast</code><ref name=":0">{{Cita libro|autore=Luis Joyanes Aguilar|titolo=Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti|edizione=II edizione in lingua italiana|anno=2008|editore=[[McGraw-Hill Education]]|città=[[Madrid]]-[[Milano]]|ISBN=978-88-386-6477-9}}</ref><ref>{{Cita libro|autore=Stanley Lippman|autore2=Josée Lajoie|autore3=Barbara Moo|titolo=C++ Primer|anno=2013|url=https://archive.org/details/cprimer0000lipp_5thed|edizione=V edizione|editore=Addison-Wesley Professional|ISBN=978-0321714114}}</ref><ref>{{Cita web|url=https://www.html.it/pag/72598/conversione-di-tipo/|titolo=Conversione di tipo|sito=HTML.it|accesso=2024-09-14}}</ref>.
Questa è una lista degli [[Operatore (informatica)|operatori]] nei [[Linguaggio di programmazione|linguaggi di programmazione]] [[C (linguaggio di programmazione)|C]] e [[C++]]. Tutti gli operatori elencati di seguito (eccetto ''typeof'') esistono nel linguaggio C++, mentre in C solo quelli indicati nella colonna “Incluso in C”.
 
Molti degli operatori disponibili in C e C++ sono implementabili pure in altri linguaggi della cosiddetta “famiglia C”, quali [[C sharp|C#]], [[D (linguaggio di programmazione)|D]], ma anche [[Java (linguaggio di programmazione)|Java]], [[Perl]] e [[PHP]], mantenendo le medesime caratteristiche mostrate (arietà, posizione e associatività)<ref>{{Cita web|url=https://www.andreaminini.com/programmazione/c/c-sharp|titolo=Il linguaggio C#|sito=www.andreaminini.com|lingua=it-IT|accesso=2024-08-30}}</ref><ref>{{Cita web|url=https://dlang.org/spec/operatoroverloading.html|titolo=Operator Overloading - D Programming Language|sito=dlang.org|accesso=2024-08-30}}</ref>.
C++ include inoltre gli operatori ''type conversion'' (): <code>const_cast</code>, <code>static_cast</code>, <code>dynamic_cast</code>, e <code>reinterpret_cast</code>. La formattazione di questi operatori intende che il livello di precedenza è irrilevante.
 
== Sintassi degli operatori ==
Molti degli operatori disponibili in C e C++ sono implementabili anche in altri linguaggi della “C family”, quali [[C sharp|C#]], [[D (linguaggio di programmazione)|D]], ma anche [[Java (linguaggio di programmazione)|Java]], [[Perl]] e [[PHP]], con le medesime caratteristiche mostrate (precedenze, associatività e semantica).
Nelle tabelle seguenti, <code>a</code>, <code>b</code> e <code>c</code> rappresentano valori validi qualsiasi (''literals'', valori da variabili, oppure ''return value'') o, in alcuni casi specifici, nomi di oggetti o ''lvalues''. <code>R</code>, <code>S</code> e <code>T</code> indicano qualsiasi tipo, mentre <code>K</code> indica un tipo di classe o un tipo ''enum''<ref>{{Cita web|url=https://www.math.unipd.it/~sperduti/CORSO-C++/Operatori.htm|titolo=1.3 Operatori.|sito=www.math.unipd.it|accesso=2024-08-30}}</ref><ref>{{Cita web|url=https://www.html.it/pag/15482/operatori-booleani/|titolo=Operatori booleani|sito=HTML.it|accesso=2024-08-30}}</ref>.
 
== Overloading degli operatori ==
[[C++]] possiede molti operatori già predefiniti in grado di operare su vari [[Tipo di dato|tipi di dato]], perciò si può parlare di “operatori già sovraccaricati”. Per esempio l’operatore <code>+</code> può essere implementato per sommare sia due variabili di tipo <code>int</code> (interi), sia due variabili di tipo <code>float</code> o <code>double</code> (variabili a virgola mobile).
 
Oltre a quando detto in precedenza, il programmatore può anche “estendere” l’operatività di ciascuno di essi; per esempio operandi complessi definiti con le classi, si potrebbero trattare anche come se fossero dati semplici.
 
In C++ è possibile sovraccaricare tutti gli operatori predifiniti, con l’eccezione su accesso al membro <code>(.)</code>, indirezione di accesso al membro <code>(.*)</code> e risoluzione di ambito <code>(::)</code>.
 
Nel caso degli operatori, il numero degli operandi e la priorità dell’operatore sovraccaricato sono le stesse dell’operatore predefinito, mentre il nuovo operatore può essere definito come una funzione membro oppure come una ''funzione friend'' (funzione amica).
 
== Tabelle degli operatori ==
Nelle tabelle seguenti, <code>a</code>, <code>b</code> e <code>c</code> rappresentano valori validi qualsiasi (''literals'', valori da variabili, oppure ''return value'') o, in alcuni casi specifici, nomi di oggetti o ''lvalues''. <code>R</code>, <code>S</code> e <code>T</code> indicano qualsiasi tipo, mentre <code>K</code> indica un tipo di classe o un tipo ''enum''.
 
=== Operatori aritmetici ===
Tutti gli operatori aritmetici esistono sia in [[C (linguaggio di programmazione)|C]] e C++ e possono essere, come già indicato, sovraccaricati solo in [[C++]]<ref>{{Cita web|url=https://www.britannica.com/technology/C-computer-language|titolo=C++ {{!}} Definition, History, & Facts {{!}} Britannica|sito=www.britannica.com|lingua=en|accesso=2024-08-30}}</ref>.
{| class="wikitable"
|+
Line 103 ⟶ 92:
|-
!Uguale
|<code>a '''a="='''" b</code> | <code>a = b</code>
|{{Sit}}
|<code>bool K::operator ==(S const& b) const;</code>
Line 163 ⟶ 152:
 
=== Operatori bit a bit ===
Tutti gli operatori bit a bit (o di manipolazione dei bit) esistono sia [[C (linguaggio di programmazione)|C]] che [[C++]] e possono essere sovraccaricati soltanto nel linguaggio inventato da [[Bjarne Stroustrup]]<ref>{{Cita web|url=https://www.treccani.it/enciclopedia/linguaggio-c_(Enciclopedia-della-Scienza-e-della-Tecnica)/|titolo=Linguaggio c++ - Enciclopedia|sito=Treccani|lingua=it|accesso=2024-08-30}}</ref>.
{| class="wikitable"
|+
Line 267 ⟶ 256:
{| class="wikitable"
|+
! rowspan="2" |Nome operatore<ref name=":1">{{Cita libro|autore=Andrea Domenici|autore2=Graziano Frosini|titolo=Introduzione alla programmazione ed elementi di strutture dati con il linguaggio [[C++]]|edizione=VIII edizione|collana="Informatica", diretta da A. L. Frisiani|città=[[Milano]]/[[Pisa]]|ISBN=978-8846462022}}</ref>
! rowspan="2" |Sintassi
! rowspan="2" |Ammette overload (sovraccarico) in C++
Line 328 ⟶ 317:
 
=== Altri operatori ===
{| class="wikitable"
''work in progress''
|+
! rowspan="2" |Nome operatore
! rowspan="2" |Sintassi
! rowspan="2" |Ammette overload (sovraccarico) in C++
! rowspan="2" |Implementabile in C
! colspan="2" |Esempi di implementazione in C++
|-
!Come membro della classe K
!Fuori dalla classe
|-
!Chiamata di funzione
|<code>a'''('''a1, a2''')'''</code>
|{{Sit}}
|{{Sit}}
|R K::operator ()(S a, T b, ...);
|
|-
!Virgola
|<code>a''',''' b</code>
|{{Sit}}
|{{Sit}}
|<code>R K::'''operator''' ,(S b);</code>
|<code>R '''operator''' ,(K a, S b);</code>
|-
!Espressione condizionale
|<code>a '''?''' b ''':''' c</code>
|{{Not}}
|{{Sit}}
|{{ND}}
|{{ND}}
|-
!Risolutore di visibilità
|<code>a'''::'''b</code>
|{{Not}}
|{{Not}}
|{{ND}}
|{{ND}}
|-
!Dimensione di oggetto o di tipo (''sizeof'')
|<code>'''sizeof''' a</code>
<code>'''sizeof''' (R)</code>
|{{Not}}
|{{Sit}}
|{{ND}}
|{{ND}}
|-
!Conversione di tipo ''static_cast''
|<code>'''static_cast'''<R>(a)</code>
|{{Sit}}
|{{Not}}
|<code>K::'''operator''' R();</code>
<code>'''explicit''' K::'''operator''' R();</code> ''since C++11''<ref>Per le conversioni definite dall'utente, il tipo di ritorno corrisponde implicitamente e necessariamente al nome dell'operatore, a meno che il tipo non sia dedotto. (es. <code>'''operator''' '''auto'''(), '''operator''' '''decltype'''('''auto''')()</code> etc.).</ref>
|{{ND}}
|-
!Conversione const ''const_cast''
|<code>'''const_cast'''<R>(a)</code>
|{{Not}}
|{{Not}}
|{{ND}}
|{{ND}}
|-
!Allocazione
|<code>'''new''' R</code>
|{{Sit}}
|{{Not}}
|<code>void* K::'''operator''' '''new'''(size_t x);</code>
|<code>void* '''operator''' '''new'''(size_t x);</code>
|-
!Allocazione di array
|<code>'''new''' R'''['''n''']'''</code>
|{{Sit}}
|{{Not}}
|<code>void* K::'''operator''' '''new'''[](size_t a);</code>
|<code>void* '''operator''' '''new'''[](size_t a);</code>
|-
!Deallocazione
|<code>'''delete''' a</code>
|{{Sit}}
|{{Not}}
|<code>void K::'''operator''' delete(void* a);</code>
|<code>void '''operator''' '''delete'''(void* a);</code>
|-
!Deallocazione di array
|<code>'''delete[]''' a</code>
|{{Sit}}
|{{Not}}
|<code>void K::'''operator''' '''delete'''[](void* a);</code>
|<code>void '''operator''' '''delete'''[](void* a);</code>
|}
 
== Overloading degli operatori ==
[[C++]] possiede molti operatori già predefiniti in grado di operare su vari [[Tipo di dato|tipi di dato]], perciò si può parlare di “operatori già sovraccaricati”. Per esempio l’operatore <code>+</code> può essere implementato per sommare sia due variabili di tipo <code>int</code> (interi), sia due variabili di tipo <code>float</code> o <code>double</code> (variabili a virgola mobile).
 
Oltre a quando detto in precedenza, il programmatore può anche “estendere” l’operatività di ciascuno di essi; per esempio operandi complessi definiti con le classi, si potrebbero trattare anche come se fossero dati semplici<ref name=":0" />.
 
In C++ è possibile sovraccaricare tutti gli operatori predefiniti, con l’eccezione su accesso al membro <code>(.)</code>, indirezione di accesso al membro <code>(.*)</code> e risoluzione di ambito <code>(::)</code>.
 
Nel caso degli operatori, il numero degli operandi e la priorità dell’operatore sovraccaricato sono le stesse dell’operatore predefinito, mentre il nuovo operatore può essere definito come una ''funzione membro'' oppure come una ''funzione friend'' (funzione amica)<ref>{{Cita pubblicazione|autore=Marco Cococcioni|titolo=Le classi nel linguaggio C++|editore=Dipartimento di Ingegneria dell'Informazione dell'[[Università di Pisa]]|url=http://docenti.ing.unipi.it/m.cococcioni/FdP/parte_2.pdf}}</ref>.
 
== Proprietà degli operatori ==
Ogni operatore possiede delle proprietà, in modo tale da permettere l'interpretazione univoca del significato di ogni singola espressione. Gli esempi che seguono sono tutti applicabili al linguaggio [[C++]] e, a seconda dei casi, anche al [[C (linguaggio di programmazione)|C]]<ref>{{Cita pubblicazione|autore=Marco Cococcioni|titolo=Programmazione in stile C, utilizzando il linguaggio C++|editore=Dipartimento di Ingegneria dell'Informazione dell'[[Università di Pisa]]|url=http://docenti.ing.unipi.it/m.cococcioni/FdP/parte_1.pdf}}</ref>.
 
=== Posizione ===
Un operatore può precedere gli operandi (o argomenti), seguirli oppure né precederli né seguirli<ref name=":1" />. In questi casi parleremo rispettivamente di operatori ''prefissi'', ''postfissi'' oppure ''infissi''.
 
=== Numero di operandi ===
Ogni operatore può avere un numero diverso di operandi (arietà). <syntaxhighlight lang="c++">
a[b]
</syntaxhighlight>Nel caso riportato, l'operatore di indicizzazione possiede due operandi, ossia le parentesi quadre. L'arietà può essere anche di tre operandi, come nel caso degli operatori condizionali, riportato di seguito:<syntaxhighlight lang="c++">
e1 ? e2 : e3
</syntaxhighlight>
 
=== Precedenza degli operatori ===
Ogni operatore possiede una propria precedenza<ref>''The ISO C 1999 standard, section 6.5.6 note 71'' (Technical report). ISO. 1999.</ref><ref name=":2">{{Cita pubblicazione|autore=Marco Cococcioni|titolo=Priorità degli operatori|editore=Dipartimento di Ingegneria dell'Informazione dell'[[Università di Pisa]]|url=http://docenti.ing.unipi.it/m.cococcioni/FdP/priorita_degli_operatori.pdf}}</ref>, rappresentata attraverso un numero naturale tra 1 e 18 in ordine decrescente, dove più è piccolo il numero, maggiore sarà la priorità; per esempio un operatore con priorità 1 avrà maggiore priorità su un operatore con priorità 13.
 
Nell'esempio che segue è possibile osservare una semplice applicazione pratica delle precedenze: <syntaxhighlight lang="c++" line="1">
#include <iostream>
using namespace std;
 
int main () {
int a = 5;
int b = 6;
int c = 8;
 
int op = a+b*c;
cout << op << endl; // Stampa a schermo
 
return 0;
}
</syntaxhighlight>L'operatore moltiplicazione (<code>*</code>) possiede priorità 5, mentre l'operatore addizione (<code>+</code>) possiede priorità 6; pertanto il risultato a schermo sarà '''53''' e non 19.
 
=== Associatività degli operatori ===
L'associatività indica l'ordine in cui vengono eseguiti gli operatori aventi la stessa priorità tra loro<ref name=":1" />. Viene riportato un semplice esempio con gli operatori di divisione (priorità 5). <syntaxhighlight lang="c++" line="1">
#include <iostream>
using namespace std;
 
int main (){
float a = 5.0;
float b = 6.0;
float c = 8.0;
 
float div = a/b/c;
cout << div << endl; // Stampa a schermo
 
return 0;
}
</syntaxhighlight>Nell'esempio precedente la stampa a schermo sarà '''0.104167''' perché l'operatore di divisione segue associatività a sinistra e, quindi, il calcolatore avrà eseguito la seguente equazione: <math>div = {(a/b) \over c}</math>.
 
=== Tabella delle precedenze e delle associatività ===
Nella tabella seguente sono elencati gli operatori di [[C (linguaggio di programmazione)|C]] e [[C++]] in ordine di priorità con le loro rispettive associatività. Essi sono sempre implementabili su C++, mentre, quelli appositamente indicati nella penultima colonna da sinistra, non lo sono in C<ref name=":1" /><ref name=":2" />.
{| class="wikitable"
|+
!Priorità
!Operatore
!Nome
!Implementabile in C
!Associatività
|-
! rowspan="2" |1
(priorità massima)
|<code>class-name :: member</code>
<code>namespace-name :: member</code>
|'''Risolutore di visibilità'''
|{{Not}}
|sinistra
|-
|<code>:: member</code>
|'''Risolutore globale di visibilità'''
|{{Not}}
|destra
|-
! rowspan="8" |2
|<code>object . member</code>
|'''Selezione'''
|{{Sit}}
|sinistra
|-
|<code>pointer -> member</code>
|'''Deferenziazione e selezione'''
|{{Sit}}
|sinistra
|-
|<code>array[ rvalue ]</code>
|'''Indicizzazione'''
|{{Sit}}
|sinistra
|-
|<code>function ( actual-argument-list )</code>
|'''Chiamata di funzione'''
|{{Sit}}
|sinistra
|-
|<code>lvalue ++</code>
|'''Postincremento'''
|{{Sit}}
|destra
|-
|<code>lvalue --</code>
|'''Postdecremento'''
|{{Sit}}
|destra
|-
|<code>static_cast type<rvalue></code>
|'''Conversione di tipo'''
|{{Not}}
|sinistra
|-
|<code>const_cast type<rvalue></code>
|'''Conversione const'''
|{{Not}}
|sinistra
|-
! rowspan="13" |3
|<code>sizeof object</code>
<code>sizeof (type)</code>
|'''Dimensione'''
'''''di oggetto'''''
'''''di tipo'''''
|{{Sit}}
|destra
|-
|<code>++ lvalue</code>
|'''Preincremento'''
|{{Sit}}
|destra
|-
|<code>-- lvalue</code>
|'''Predecremento'''
|{{Sit}}
|destra
|-
|<code>~ rvalue</code>
|'''Complemento bit a bit'''
|{{Sit}}
|destra
|-
|<code>! rvalue</code>
|'''Negazione'''
|{{Sit}}
|destra
|-
|<code>- rvalue</code>
|'''Meno unitario'''
|{{Sit}}
|destra
|-
|<code>+ rvalue</code>
|'''Più unitario'''
|{{Sit}}
|destra
|-
|<code>& rvalue</code>
|'''Indirizzo'''
|{{Sit}}
|destra
|-
|<code>* rvalue</code>
|'''Deferenziazione'''
|{{Sit}}
|destra
|-
|<code>new type</code>
|'''Allocazione'''
|{{Not}}
|destra
|-
|<code>new type[]</code>
|'''Allocazione di array'''
|{{Not}}
|destra
|-
|<code>delete pointer</code>
|'''Deallocazione'''
|{{Not}}
|destra
|-
|<code>delete[] pointer</code>
|'''Deallocazione di array'''
|{{Not}}
|destra
|-
! rowspan="2" |4
|<code>object .* pointer-to-member</code>
|'''Selezione con puntatore a membro'''
|{{Not}}
|sinistra
|-
|<code>pointer ->* pointer-to-member</code>
|'''Deferenziazione e selezione con puntatore a membro'''
|{{Not}}
|sinistra
|-
! rowspan="3" |5
|<code>rvalue * rvalue</code>
|'''Moltiplicazione'''
|{{Sit}}
|sinistra
|-
|<code>rvalue / rvalue</code>
|'''Divisione'''
|{{Sit}}
|sinistra
|-
|<code>rvalue % rvalue</code>
|'''Modulo'''
|{{Sit}}
|sinistra
|-
! rowspan="2" |6
|<code>rvalue + rvalue</code>
|'''Addizione'''
|{{Sit}}
|sinistra
|-
|<code>rvalue - rvalue</code>
|'''Sottrazione'''
|{{Sit}}
|sinistra
|-
! rowspan="2" |7
|<code>rvalue << rvalue</code>
|'''Traslazione sinistra'''
|{{Sit}}
|sinistra
|-
|<code>rvalue >> rvalue</code>
|'''Traslazione destra'''
|{{Sit}}
|sinistra
|-
! rowspan="4" |8
|<code>rvalue < rvalue</code>
|'''Minore'''
|{{Sit}}
|sinistra
|-
|<code>rvalue <= rvalue</code>
|'''Minore o uguale'''
|{{Sit}}
|sinistra
|-
|<code>rvalue > rvalue</code>
|'''Maggiore'''
|{{Sit}}
|sinistra
|-
|<code>rvalue >= rvalue</code>
|'''Maggiore o uguale'''
|{{Sit}}
|sinistra
|-
! rowspan="2" |9
|<code>rvalue == rvalue</code>
|'''Uguale'''
|{{Sit}}
|sinistra
|-
|<code>rvalue != rvalue</code>
|'''Diverso'''
|{{Sit}}
|sinistra
|-
!10
|<code>rvalue & rvalue</code>
|'''AND bit a bit'''
|{{Sit}}
|sinistra
|-
!11
|<code>rvalue ^ rvalue</code>
|'''OR esclusivo bit a bit'''
|{{Sit}}
|sinistra
|-
!12
|<code><nowiki>rvalue | rvalue</nowiki></code>
|'''OR bit a bit'''
|{{Sit}}
|sinistra
|-
!13
|<code>rvalue && rvalue</code>
|'''AND logico'''
|{{Sit}}
|sinistra
|-
!14
|<code><nowiki>rvalue || rvalue</nowiki></code>
|'''OR logico'''
|{{Sit}}
|sinistra
|-
!15
|<code>co_await</code>
<code>co_yield</code>
|'''Coroutine'''
|{{Not}}
|destra
|-
!16
|<code>rvalue ? rvalue : rvalue</code>
|'''Espressione condizionale'''
|{{Sit}}
|sinistra
|-
! rowspan="11" |17
|<code>lvalue = rvalue</code>
|'''Assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue += rvalue</code>
|'''Addizione e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue -= rvalue</code>
|'''Sottrazione e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue *= rvalue</code>
|'''Moltiplicazione e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue /= rvalue</code>
|'''Divisione e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue %= rvalue</code>
|'''Modulo e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue &= rvalue</code>
|'''AND bit a bit e assegnamento'''
|{{Sit}}
|destra
|-
|<code><nowiki>lvalue |= rvalue</nowiki></code>
|'''OR bit a bit e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue ^= rvalue</code>
|'''OR esclusivo bit a bit e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue <<= rvalue</code>
|'''Traslazione a sinistra e assegnamento'''
|{{Sit}}
|destra
|-
|<code>lvalue =>> rvalue</code>
|'''Traslazione a destra e assegnamento'''
|{{Not}}
|destra
|-
!18
(priorità minima)
|<code>expression , expression</code>
|'''Virgola'''
|{{Sit}}
|sinistra
|}
 
=== Critiche sulle precedenze degli operatori ===
La precedenza degli operatori logici bitwise è stata al centro di numerose critiche<ref>{{Cita web|url=https://www.bell-labs.com/usr/dmr/www/chist.html|titolo=Chistory|sito=www.bell-labs.com|accesso=2024-08-30}}</ref><ref>{{Cita web|url=https://www.perlmonks.org/?node_id=1159769|titolo=Re^10: next unless condition|sito=www.perlmonks.org|accesso=2024-08-30}}</ref>, poiché concettualmente, <code>&</code> e <code>|</code> sono operatori aritmetici come <code>*</code> e <code>+</code>.
 
Per esempio, l'espressione <code>a & b == 7</code> viene sintatticamente analizzata come <code>a & (b == 7)</code>, mentre l'espressione <code>a + b == 7</code> viene analizzata come <code>(a + b) == 7</code>. Ciò richiede l'uso delle parentesi più spesso di quanto sarebbe altrimenti necessario.
 
Storicamente, non esisteva una distinzione sintattica tra gli operatori bit a bit e quelli logici. Nei linguaggi [[BCPL]], [[B (linguaggio di programmazione)|B]] e nelle prime versioni di [[C (linguaggio di programmazione)|C]], gli operatori && e || non esistevano proprio; invece, <code>& |</code> aveva un significato diverso a seconda che venisse usato in un “contesto di valore di verità” (cioè quando ci si aspettava il ritorno di un valore [[Booleano (informatica)|booleano]], come in <code>if (a==b & c) {...}</code> e si comportava come un operatore logico, ma in <code>c = a & b</code> si comportava invece come un operatore bit a bit).
 
La sintassi attuale è stata mantenuta soltanto per consentire la retrocompatibilità con le installazioni già esistenti.
 
Peraltro, in C++ (e nelle versioni successive di C) le operazioni di uguaglianza, con l'eccezione dell'operatore di confronto logico a tre, producono valori di tipo bool che sono concettualmente un singolo bit (1 o 0) e come tali non appartengono propriamente alle operazioni bit a bit.
 
== Sinonimi in C++ ==
[[C++]] definisce una serie di ''keywords'' che possono essere implementate come sinonimi rispetto agli operatori<ref>''ISO/IEC 14882:1998(E) Programming Language C++''. open-std.org – The C++ Standards Committee. 1 September 1998. pp. 40–41.</ref>; tali definizioni non sono assolutamente implementabili nel [[linguaggio C]].
 
{| class="wikitable"
!'''Keyword'''
!'''Operator'''
|-
|<code>and</code>
|<code>&&</code>
|-
|<code>and_eq</code>
|<code>&=</code>
|-
|<code>bitand</code>
|<code>&</code>
|-
|<code>bitor</code>
|<code><nowiki>|</nowiki></code>
|-
|<code>compl</code>
|<code>~</code>
|-
|<code>not</code>
|<code>!</code>
|-
|<code>not_eq</code>
|<code>!=</code>
|-
|<code>or</code>
|<code><nowiki>||</nowiki></code>
|-
|<code>or_eq</code>
|<code><nowiki>|=</nowiki></code>
|-
|<code>xor</code>
|<code>^</code>
|-
|<code>xor_eq</code>
|<code>^=</code>
|}
Questi possono essere utilizzati esattamente come sostituti dei rispettivi simboli di punteggiatura; ciò significa, per esempio, che le espressioni <code>(a > 0 AND NOT flag)</code> e <code>(a > 0 && flag)</code> avranno un significato assolutamente identico.
 
== Note ==
<references />
 
== Bibliografia ==
 
* {{Cita libro|autore=[[Bjarne Stroustrup]]|titolo=The C++ Programming Language|editore=Addison-Wesley|lingua=inglese|ISBN=978-0-201-70073-2}}
* {{Cita libro|autore=Andrea Domenici, Graziano Frosini|titolo=Introduzione alla programmazione ed elementi di strutture dati con il linguaggio C++|anno=2013|editore=Franco Angeli Editore|p=480|ISBN=978-88-464-6202-2}}
* {{Cita pubblicazione|autore=Marco Cococcioni|titolo=Fondamenti di programmazione|editore=Dipartimento di Ingegneria dell'Informazione dell'[[Università di Pisa]]|url=http://docenti.ing.unipi.it/m.cococcioni/FdP/parti_0_1_e_2_pronte_per_la_stampa.pdf}}
* {{Cita libro|autore=Luis Joyanes Aguilar|titolo=Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti|editore=[[McGraw-Hill Education]]|città=[[Madrid]]-[[Milano]]|lingua=spagnolo|ISBN=978-88-386-6477-9}}
 
== Voci correlate ==
 
* [[C++]]
* [[C (linguaggio di programmazione)]]
* [[Scienze dell'Informazione|Scienza dell'informazione]]
* [[Linguaggio di programmazione]]
 
== Collegamenti esterni ==
 
* Volle, Adam. "C++". [[Enciclopedia Britannica|''Encyclopedia Britannica'']], 19 Jun. 2024, https://www.britannica.com/technology/C-computer-language;
* [https://learn.microsoft.com/en-us/cpp/?view=msvc-170 Microsoft C++, C, and Assembler documentation].
{{C++}}{{Linguaggio C}}
{{Principali linguaggi di programmazione}}{{Controllo di autorità}}