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

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
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: 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 ===
=== 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++]].
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"
{| class="wikitable"
|+
|+
Riga 103: Riga 92:
|-
|-
!Uguale
!Uguale
|<code>a '''==''' b</code>| <code>a = b</code>
| a="=" b | <code>a = b</code>
|{{Sit}}
|{{Sit}}
|<code>bool K::operator ==(S const& b) const;</code>
|<code>bool K::operator ==(S const& b) const;</code>
Riga 163: Riga 152:


=== Operatori bit a bit ===
=== 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]].
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"
{| class="wikitable"
|+
|+
Riga 267: Riga 256:
{| class="wikitable"
{| class="wikitable"
|+
|+
! rowspan="2" |Nome operatore<ref>{{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" |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" |Sintassi
! rowspan="2" |Ammette overload (sovraccarico) in C++
! rowspan="2" |Ammette overload (sovraccarico) in C++
Riga 328: Riga 317:


=== Altri operatori ===
=== 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 ==
== Note ==
<references />


== Bibliografia ==
== 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 ==
== Voci correlate ==

* [[C++]]
* [[C (linguaggio di programmazione)]]
* [[Scienze dell'Informazione|Scienza dell'informazione]]
* [[Linguaggio di programmazione]]


== Collegamenti esterni ==
== 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}}
{{C++}}{{Linguaggio C}}
{{Principali linguaggi di programmazione}}{{Controllo di autorità}}
{{Principali linguaggi di programmazione}}{{Controllo di autorità}}

Versione attuale delle 17:51, 14 set 2024

Questa è una lista degli operatori nei linguaggi 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 const_cast, static_cast, dynamic_cast, e reinterpret_cast[1][2][3].

Molti degli operatori disponibili in C e C++ sono implementabili pure in altri linguaggi della cosiddetta “famiglia C”, quali C#, D, ma anche Java, Perl e PHP, mantenendo le medesime caratteristiche mostrate (arietà, posizione e associatività)[4][5].

Sintassi degli operatori

[modifica | modifica wikitesto]

Nelle tabelle seguenti, a, b e c rappresentano valori validi qualsiasi (literals, valori da variabili, oppure return value) o, in alcuni casi specifici, nomi di oggetti o lvalues. R, S e T indicano qualsiasi tipo, mentre K indica un tipo di classe o un tipo enum[6][7].

Operatori aritmetici

[modifica | modifica wikitesto]

Tutti gli operatori aritmetici esistono sia in C e C++ e possono essere, come già indicato, sovraccaricati solo in C++[8].

Nome operatore Sintassi Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Addizione a+b R K::operator +(S b); R operator +(K a, S b);
Sottrazione a-b R K::operator -(S b); R operator -(K a, S b);
Unario più +a R K::operator +(); R operator +(K a);
Unario meno -a R K::operator -(); R operator -(K a);
Moltiplicazione a * b R K::operator *(S b); R operator *(K a, S b);
Divisione a / b R K::operator /(S b); R operator /(K a, S b);
Modulo a % b R K::operator %(S b); R operator %(K a, S b);
Incremento Prefisso ++a R& K::operator ++(); R& operator ++(K& a);
Postfisso a++ R K::operator ++(int); R operator ++(K& a, int);
Il C++ utilizza il parametro fittizio senza nome int per differenziare gli operatori di incremento prefisso e postfisso.
Decremento Prefisso --a R& K::operator --(); R& operator --(K& a);
Postfisso a-- R K::operator --(int); R operator --(K& a, int);
Il C++ utilizza il parametro fittizio senza nome int per differenziare gli operatori di incremento prefisso e postfisso.

Operatori relazionali

[modifica | modifica wikitesto]

Tutti gli operatori di confronto possono essere sovraccaricati solo in C++. Dal C++20, l'operatore di disuguaglianza viene generato automaticamente se viene definito operator== e tutti e quattro gli operatori relazionali vengono generati automaticamente se viene definito operator<=>.

Nome operatore Sintassi Incluso in C Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Uguale a = b bool K::operator ==(S const& b) const; bool operator ==(K const& a, S const& b);
Diverso a != b bool K::operator !=(S const& b) const; bool operator !=(K const& a, S const& b);
Maggiore di a > b bool K::operator >(S const& b) const; bool operator >(K const& a, S const& b);
Minore di a < b bool K::operator <(S const& b) const; bool operator <(K const& a, S const& b);
Maggiore o uguale a a >= b bool K::operator >=(S const& b) const; bool operator >=(K const& a, S const& b);
Minore o uguale a a <= b bool K::operator <=(S const& b) const; bool operator <=(K const& a, S const& b);

Operatori logici (o booleani)

[modifica | modifica wikitesto]

Tutti gli operatori logici (o booleani[9]) sono esistenti sia in C che in C++ e possono essere chiaramente sovraccaricati solo in quest'ultimo linguaggio di programmazione.

Nonostante la possibilità di sovraccarico in C++, tale operazione è sconsigliata con AND logico e OR logico sia sconsigliato perché, come operatori sovraccaricati, si comporterebbero come normali chiamate di funzione, il che significa che entrambi i loro operandi verrebbero valutati, perdendo di conseguenza la loro importante valutazione di McCarthy. [10]

Nome dell'operatore Sintassi Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
NOT logico ! a bool K::operator !(); bool operator !(K a);
AND logico a && b bool K::operator &&(S b); bool operator &&(K a, S b);
OR logico a || b bool K::operator ||(S b); bool operator ||(K a, S b);

Operatori bit a bit

[modifica | modifica wikitesto]

Tutti gli operatori bit a bit (o di manipolazione dei bit) esistono sia C che C++ e possono essere sovraccaricati soltanto nel linguaggio inventato da Bjarne Stroustrup[11].

Nome dell'operatore Sintassi Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Complemento a uno (inversione di tutti i bit) ~a R K::operator ~(); R operator ~(K a);
AND bit a bit a & b R K::operator &(S b); R operator &(K a, S b);
OR inclusivo bit a bit a | b R K::operator |(S b); R operator |(K a, S b);
OR esclusivo bit a bit (OR exclusive, XOR) a ^ b R K::operator ^(S b); R operator ^(K a, S b);
Spostamento di tutti i bit verso sinistra a << b R K::operator <<(S b); R operator <<(K a, S b);
Spostamento di tutti i bit verso destra a >> b R K::operator >>(S b); R operator >>(K a, S b);

Operatori ed espressioni di assegnamento

[modifica | modifica wikitesto]

Tutti gli operatori e le espressioni di assegnamento sono esistenti sia in C che in C++ e possono essere chiaramente sovraccaricate solo in quest'ultimo linguaggio di programmazione.

Per gli operatori indicati, la semantica dell'espressione di assegnazione combinata incorporata a ⊚= b è equivalente a a = a ⊚ b, eccetto per il fatto che a viene valutata una sola volta.

Tipologia assegnamento Sintassi Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Espressione semplice di assegnamento a = b R& K::operator =(S b); N.D.
Assegnamenti composti a += b R& K::operator +=(S b); R& operator +=(K& a, S b);
a -= b R& K::operator -=(S b); R& operator -=(K& a, S b);
a *= b R& K::operator *=(S b); R& operator *=(K& a, S b);
a /= b R& K::operator /=(S b); R& operator /=(K& a, S b);
a %= b R& K::operator %=(S b); R& operator %=(K& a, S b);
a &= b R& K::operator &=(S b); R& operator &=(K& a, S b);
a |= b R& K::operator |=(S b); R& operator |=(K& a, S b);
a ^= b R& K::operator ^=(S b); R& operator ^=(K& a, S b);
a <<= b R& K::operator <<=(S b); R& operator <<=(K& a, S b);
a >>= b R& K::operator >>=(S b); R& operator >>=(K& a, S b);

Operatori membro e puntatore

[modifica | modifica wikitesto]
Nome operatore[12] Sintassi Ammette overload (sovraccarico) in C++ Implementabile in C Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Indicizzazione a[b] R& K::operator [](S b);

R& K::operator [](S b, ...); // since C++23

N.D.
Deferenziazione *a R& K::operator *(); R& operator *(K a);
Indirizzo &a R* K::operator &(); R* operator &(K a);
Deferenziazione e selezione a->b R* K::operator ->(); N.D.
Selezione (object.member) a.b No N.D. N.D.
Deferenziazione e selezione con puntatore a membro a->*b No R& K::operator ->*(S b); R& operator ->*(K a, S b);
Selezione con puntatore a membro a.*b No No N.D. N.D.

Altri operatori

[modifica | modifica wikitesto]
Nome operatore Sintassi Ammette overload (sovraccarico) in C++ Implementabile in C Esempi di implementazione in C++
Come membro della classe K Fuori dalla classe
Chiamata di funzione a(a1, a2) R K::operator ()(S a, T b, ...);
Virgola a, b R K::operator ,(S b); R operator ,(K a, S b);
Espressione condizionale a ? b : c No N.D. N.D.
Risolutore di visibilità a::b No No N.D. N.D.
Dimensione di oggetto o di tipo (sizeof) sizeof a

sizeof (R)

No N.D. N.D.
Conversione di tipo static_cast static_cast<R>(a) No K::operator R();

explicit K::operator R(); since C++11[13]

N.D.
Conversione const const_cast const_cast<R>(a) No No N.D. N.D.
Allocazione new R No void* K::operator new(size_t x); void* operator new(size_t x);
Allocazione di array new R[n] No void* K::operator new[](size_t a); void* operator new[](size_t a);
Deallocazione delete a No void K::operator delete(void* a); void operator delete(void* a);
Deallocazione di array delete[] a No void K::operator delete[](void* a); void operator delete[](void* a);

Overloading degli operatori

[modifica | modifica wikitesto]

C++ possiede molti operatori già predefiniti in grado di operare su vari tipi di dato, perciò si può parlare di “operatori già sovraccaricati”. Per esempio l’operatore + può essere implementato per sommare sia due variabili di tipo int (interi), sia due variabili di tipo float o double (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[1].

In C++ è possibile sovraccaricare tutti gli operatori predefiniti, con l’eccezione su accesso al membro (.), indirezione di accesso al membro (.*) e risoluzione di ambito (::).

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)[14].

Proprietà degli operatori

[modifica | modifica wikitesto]

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[15].

Un operatore può precedere gli operandi (o argomenti), seguirli oppure né precederli né seguirli[12]. In questi casi parleremo rispettivamente di operatori prefissi, postfissi oppure infissi.

Numero di operandi

[modifica | modifica wikitesto]

Ogni operatore può avere un numero diverso di operandi (arietà).

a[b]

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:

e1 ? e2 : e3

Precedenza degli operatori

[modifica | modifica wikitesto]

Ogni operatore possiede una propria precedenza[16][17], 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:

#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;
}

L'operatore moltiplicazione (*) possiede priorità 5, mentre l'operatore addizione (+) possiede priorità 6; pertanto il risultato a schermo sarà 53 e non 19.

Associatività degli operatori

[modifica | modifica wikitesto]

L'associatività indica l'ordine in cui vengono eseguiti gli operatori aventi la stessa priorità tra loro[12]. Viene riportato un semplice esempio con gli operatori di divisione (priorità 5).

#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;
}

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: .

Tabella delle precedenze e delle associatività

[modifica | modifica wikitesto]

Nella tabella seguente sono elencati gli operatori di 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[12][17].

Priorità Operatore Nome Implementabile in C Associatività
1

(priorità massima)

class-name :: member

namespace-name :: member

Risolutore di visibilità No sinistra
:: member Risolutore globale di visibilità No destra
2 object . member Selezione sinistra
pointer -> member Deferenziazione e selezione sinistra
array[ rvalue ] Indicizzazione sinistra
function ( actual-argument-list ) Chiamata di funzione sinistra
lvalue ++ Postincremento destra
lvalue -- Postdecremento destra
static_cast type<rvalue> Conversione di tipo No sinistra
const_cast type<rvalue> Conversione const No sinistra
3 sizeof object

sizeof (type)

Dimensione

di oggetto di tipo

destra
++ lvalue Preincremento destra
-- lvalue Predecremento destra
~ rvalue Complemento bit a bit destra
! rvalue Negazione destra
- rvalue Meno unitario destra
+ rvalue Più unitario destra
& rvalue Indirizzo destra
* rvalue Deferenziazione destra
new type Allocazione No destra
new type[] Allocazione di array No destra
delete pointer Deallocazione No destra
delete[] pointer Deallocazione di array No destra
4 object .* pointer-to-member Selezione con puntatore a membro No sinistra
pointer ->* pointer-to-member Deferenziazione e selezione con puntatore a membro No sinistra
5 rvalue * rvalue Moltiplicazione sinistra
rvalue / rvalue Divisione sinistra
rvalue % rvalue Modulo sinistra
6 rvalue + rvalue Addizione sinistra
rvalue - rvalue Sottrazione sinistra
7 rvalue << rvalue Traslazione sinistra sinistra
rvalue >> rvalue Traslazione destra sinistra
8 rvalue < rvalue Minore sinistra
rvalue <= rvalue Minore o uguale sinistra
rvalue > rvalue Maggiore sinistra
rvalue >= rvalue Maggiore o uguale sinistra
9 rvalue == rvalue Uguale sinistra
rvalue != rvalue Diverso sinistra
10 rvalue & rvalue AND bit a bit sinistra
11 rvalue ^ rvalue OR esclusivo bit a bit sinistra
12 rvalue | rvalue OR bit a bit sinistra
13 rvalue && rvalue AND logico sinistra
14 rvalue || rvalue OR logico sinistra
15 co_await

co_yield

Coroutine No destra
16 rvalue ? rvalue : rvalue Espressione condizionale sinistra
17 lvalue = rvalue Assegnamento destra
lvalue += rvalue Addizione e assegnamento destra
lvalue -= rvalue Sottrazione e assegnamento destra
lvalue *= rvalue Moltiplicazione e assegnamento destra
lvalue /= rvalue Divisione e assegnamento destra
lvalue %= rvalue Modulo e assegnamento destra
lvalue &= rvalue AND bit a bit e assegnamento destra
lvalue |= rvalue OR bit a bit e assegnamento destra
lvalue ^= rvalue OR esclusivo bit a bit e assegnamento destra
lvalue <<= rvalue Traslazione a sinistra e assegnamento destra
lvalue =>> rvalue Traslazione a destra e assegnamento No destra
18

(priorità minima)

expression , expression Virgola sinistra

Critiche sulle precedenze degli operatori

[modifica | modifica wikitesto]

La precedenza degli operatori logici bitwise è stata al centro di numerose critiche[18][19], poiché concettualmente, & e | sono operatori aritmetici come * e +.

Per esempio, l'espressione a & b == 7 viene sintatticamente analizzata come a & (b == 7), mentre l'espressione a + b == 7 viene analizzata come (a + b) == 7. 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 e nelle prime versioni di C, gli operatori && e || non esistevano proprio; invece, & | 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, come in if (a==b & c) {...} e si comportava come un operatore logico, ma in c = a & b 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++

[modifica | modifica wikitesto]

C++ definisce una serie di keywords che possono essere implementate come sinonimi rispetto agli operatori[20]; tali definizioni non sono assolutamente implementabili nel linguaggio C.

Keyword Operator
and &&
and_eq &=
bitand &
bitor |
compl ~
not !
not_eq !=
or ||
or_eq |=
xor ^
xor_eq ^=

Questi possono essere utilizzati esattamente come sostituti dei rispettivi simboli di punteggiatura; ciò significa, per esempio, che le espressioni (a > 0 AND NOT flag) e (a > 0 && flag) avranno un significato assolutamente identico.

  1. ^ a b Luis Joyanes Aguilar, Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti, II edizione in lingua italiana, Madrid-Milano, McGraw-Hill Education, 2008, ISBN 978-88-386-6477-9.
  2. ^ Stanley Lippman, Josée Lajoie e Barbara Moo, C++ Primer, V edizione, Addison-Wesley Professional, 2013, ISBN 978-0321714114.
  3. ^ Conversione di tipo, su HTML.it. URL consultato il 14 settembre 2024.
  4. ^ Il linguaggio C#, su www.andreaminini.com. URL consultato il 30 agosto 2024.
  5. ^ Operator Overloading - D Programming Language, su dlang.org. URL consultato il 30 agosto 2024.
  6. ^ 1.3 Operatori., su www.math.unipd.it. URL consultato il 30 agosto 2024.
  7. ^ Operatori booleani, su HTML.it. URL consultato il 30 agosto 2024.
  8. ^ (EN) C++ | Definition, History, & Facts | Britannica, su www.britannica.com. URL consultato il 30 agosto 2024.
  9. ^ L'accezione booleana è stata coniata in onore del matematico George Boole.
  10. ^ isocpp.org, https://isocpp.org/wiki/faq/operator-overloading.
  11. ^ Linguaggio c++ - Enciclopedia, su Treccani. URL consultato il 30 agosto 2024.
  12. ^ a b c d Andrea Domenici e Graziano Frosini, Introduzione alla programmazione ed elementi di strutture dati con il linguaggio C++, collana "Informatica", diretta da A. L. Frisiani, VIII edizione, Milano/Pisa, ISBN 978-8846462022.
  13. ^ 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. operator auto(), operator decltype(auto)() etc.).
  14. ^ Marco Cococcioni, Le classi nel linguaggio C++ (PDF), Dipartimento di Ingegneria dell'Informazione dell'Università di Pisa.
  15. ^ Marco Cococcioni, Programmazione in stile C, utilizzando il linguaggio C++ (PDF), Dipartimento di Ingegneria dell'Informazione dell'Università di Pisa.
  16. ^ The ISO C 1999 standard, section 6.5.6 note 71 (Technical report). ISO. 1999.
  17. ^ a b Marco Cococcioni, Priorità degli operatori (PDF), Dipartimento di Ingegneria dell'Informazione dell'Università di Pisa.
  18. ^ Chistory, su www.bell-labs.com. URL consultato il 30 agosto 2024.
  19. ^ Re^10: next unless condition, su www.perlmonks.org. URL consultato il 30 agosto 2024.
  20. ^ ISO/IEC 14882:1998(E) Programming Language C++. open-std.org – The C++ Standards Committee. 1 September 1998. pp. 40–41.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]