Operadors en C i C++

llista d'operadors en els llenguatges de programació C i C++

Aquesta és una llista d'operadors en els llenguatges de programació C i C++. Tots els operadors (excepte typeof) llistats existeixen en C++. Cal tenir en compte que C no admet la sobrecàrrega de l'operador.[1]

Quan no està sobrecarregat, per als operadors &&, ||, i , (l'operador de coma), hi ha un punt de seqüència després de l'avaluació del primer operand.

C++ també conté els operadors de conversió de tipus const_cast, static_cast, dynamic_cast i reinterpret_cast. El format d'aquests operadors significa que el seu nivell de precedència no és important.

La majoria dels operadors disponibles en C i C++ també estan disponibles en altres llenguatges de la família C com ara C#, D, Java, Perl i PHP amb la mateixa precedència, associativitat i semàntica.

Als efectes d'aquestes taules, a, b i c representen valors vàlids (literals, valors de variables o valor de retorn), noms d'objectes o valors l, segons correspongui. R, S i T representen qualsevol tipus, i K un tipus de classe o tipus enumerat.

Operadors aritmètics

modifica

Tots els operadors aritmètics existeixen en C i C++ i es poden sobrecarregar en C++.

Operador Sintaxi
Addició a + b
Substracció a - b
Increment unitari +a
Decrement unitari -a
Multiplicació a * b
Divisió A / b
Mòdul a % b
Increment a++
Decrement a--

Operadors de comparació/operadors relacionals

modifica

Tots els operadors de comparació es poden sobrecarregar en C++. Des de C++20, l'operador de desigualtat es genera automàticament si es defineix operator== i els quatre operadors relacionals es generen automàticament si es defineix operator<=>.[2]

Operador Sintaxi
Igual a a == b
No igual a a != b
Més gran que a > b
Més petit que a < b
Més gran o igual que a >= b
Més petit o igual que a <= b
Triple comparació a <=>b

Operadors lògics

modifica

Tots els operadors lògics existeixen en C i C++ i es poden sobrecarregar en C++, tot i que es desaconsella la sobrecàrrega de l'I lògic i l'OR lògic, perquè com a operadors sobrecarregats es comporten com a crides de funcions ordinàries, la qual cosa significa que els seus dos operands s'avaluen, de manera que perden la seva propietat d'avaluació de curtcircuits ben utilitzada i esperada.[3]

Nom de l'operador Sintaxi Exemples de prototips en C++
Com a membre de K Definicions fora de classe
Negació lògica (NO) ! a

not a

bool K :: operator ! (); bool operator ! (K a );
I lògic a && b

a and b

bool K :: operator && (S b ); bool operator && (K a , S b );
OR lògic a || b

a ??!??! b

a or b

bool K::operator ||(S b); bool operator ||(K a, S b);

Operadors per bits

modifica

Tots els operadors de bits existeixen en C i C++ i es poden sobrecarregar en C++.

Nom de l'operador Sintaxi Exemples de prototips
Com a membre de K Definicions fora de classe
Bit a bit NO ~ a

?? - a compl a

R K :: operator ~ (); R operator ~ (K a );
I per bits a & b

a bitand b

R K :: operator & (S b ); R operator & (K a , S b );
O per bits a | b

a ??! b a bitor b

R K :: operator | (S b ); R operator | (K a , S b );
XOR bit a bit a ^ b

a ?? ' b a xor b

R K :: operator ^ (S b ); R operator ^ (K a , S b );

Operadors d'assignació

modifica

Totes les expressions d'assignació existeixen en C i C++ i es poden sobrecarregar en C++.

Per als operadors donats, la semàntica de l'expressió d'assignació combinada incorporada a ⊚= b és equivalent a a = a ⊚ b, excepte que a només s'avalua una vegada.

Operador Sintaxi
Assignació directa a = b
Assignació suma a += b
Assignació resta a -= b
Assignació multiplicació a *= b
Assignació divisió a /= b

Precedència de l'operador

modifica

A continuació es mostra una taula que enumera la precedència i l'associativitat de tots els operadors en els llenguatges C i C++. Els operadors es mostren de dalt a baix, amb precedència descendent. La precedència descendent fa referència a la prioritat de l'agrupació d'operadors i operands. Tenint en compte una expressió, un operador que apareix en alguna fila s'agruparà abans de qualsevol operador que aparegui en una fila més avall. Els operadors que es troben a la mateixa cel·la (pot haver-hi diverses files d'operadors llistats en una cel·la) s'agrupen amb la mateixa precedència, en la direcció donada. La prioritat d'un operador no es veu afectada per la sobrecàrrega.

La sintaxi de les expressions en C i C++ s'especifica mitjançant una gramàtica d'estructura de frase.[4] La taula que es dóna aquí s'ha deduït de la gramàtica. Per a l'estàndard ISO C 1999, la secció 6.5.6 nota 71 estableix que la gramàtica C proporcionada per l'especificació defineix la precedència dels operadors C i també estableix que la precedència de l'operador resultant de la gramàtica segueix de prop la secció de l'especificació. encàrrec:

"La sintaxi [C] [és a dir, gramàtica] especifica la precedència dels operadors en l'avaluació d'una expressió, que és el mateix que l'ordre de les subclàusules principals d'aquesta subclàusula, la precedència més alta primer."

Referències

modifica
  1. «C++ Operator Precedence - cppreference.com» (en anglès). [Consulta: 21 desembre 2023].
  2. «Operator overloading§Comparison operators» (en anglès). cppreference.com.
  3. «Standard C++» (en anglès).
  4. ISO/IEC 9899:201x Programming Languages - C (en anglès). open-std.org – The C Standards Committee, 19 December 2011, p. 465.