Buscar..


Observaciones

Los operadores se enumeran de arriba a abajo, en precedencia descendente. Los operadores con el mismo número tienen la misma prioridad y la misma asociatividad.

  1. ::
  2. Los operadores de postfix: [] () T(...) . -> ++ -- dynamic_cast static_cast reinterpret_cast const_cast typeid
  3. Los operadores de prefijo únicos: ++ -- * & + - ! ~ sizeof new delete delete[] ; la notación de reparto de estilo C, (T)... ; (C ++ 11 y superior) sizeof... alignof noexcept
  4. .* y ->*
  5. * , / , y % , operadores aritméticos binarios
  6. + y - , operadores aritméticos binarios
  7. << y >>
  8. < , > , <= , >=
  9. == y !=
  10. & , el operador bit a bit
  11. ^
  12. |
  13. &&
  14. ||
  15. ?: (operador condicional ternario)
  16. = , *= , /= , %= , += , -= , >>= , <<= , &= , ^= , |=
  17. throw
  18. , (el operador de coma)

La asignación, la asignación compuesta y los operadores condicionales ternarios son asociativos por derecho. Todos los demás operadores binarios son asociativos por la izquierda.

Las reglas para el operador condicional ternario son un poco más complicadas de lo que pueden expresar las reglas de precedencia simples.

  • Un operando se enlaza menos fuerte a un ? a su izquierda o a : a su derecha que a cualquier otro operador. Efectivamente, el segundo operando del operador condicional se analiza como si estuviera entre paréntesis. Esto permite una expresión como a ? b , c : d para ser sintácticamente válido.
  • ¿Un operando se une más fuertemente a un ? a su derecha que a un operador de asignación o throw a su izquierda, entonces a = b ? c : d es equivalente a a = (b ? c : d) y throw a ? b : c es equivalente a throw (a ? b : c) .
  • Un operando se enlaza más estrechamente con un operador de asignación a su derecha que : a su izquierda, entonces a ? b : c = d es equivalente a a ? b : (c = d) .

Operadores aritméticos

Los operadores aritméticos en C ++ tienen la misma prioridad que en matemáticas:

La multiplicación y la división han dejado la asociatividad (lo que significa que se evaluarán de izquierda a derecha) y tienen mayor prioridad que la suma y la resta, que también tienen la asociatividad izquierda.

También podemos forzar la precedencia de la expresión usando paréntesis ( ) . De la misma manera que lo harías en las matemáticas normales.

// volume of a spherical shell = 4 pi R^3 - 4 pi r^3
double vol = 4.0*pi*R*R*R/3.0 - 4.0*pi*r*r*r/3.0;

//Addition:

int a = 2+4/2;          // equal to: 2+(4/2)         result: 4
int b = (3+3)/2;        // equal to: (3+3)/2         result: 3

//With Multiplication

int c = 3+4/2*6;        // equal to: 3+((4/2)*6)     result: 15
int d = 3*(3+6)/9;      // equal to: (3*(3+6))/9     result: 3

//Division and Modulo

int g = 3-3%1;          // equal to: 3 % 1 = 0  3 - 0 = 3
int h = 3-(3%1);        // equal to: 3 % 1 = 0  3 - 0 = 3
int i = 3-3/1%3;        // equal to: 3 / 1 = 3  3 % 3 = 0  3 - 0 = 3
int l = 3-(3/1)%3;      // equal to: 3 / 1 = 3  3 % 3 = 0  3 - 0 = 3
int m = 3-(3/(1%3));    // equal to: 1 % 3 = 1  3 / 1 = 3  3 - 3 = 0

Operadores lógicos AND y OR

Estos operadores tienen la precedencia habitual en C ++: Y antes de OR.

// You can drive with a foreign license for up to 60 days
bool can_drive = has_domestic_license || has_foreign_license && num_days <= 60;

Este código es equivalente a lo siguiente:

// You can drive with a foreign license for up to 60 days
bool can_drive = has_domestic_license || (has_foreign_license && num_days <= 60);

Agregar el paréntesis no cambia el comportamiento, sin embargo, hace que sea más fácil de leer. Al agregar estos paréntesis, no existe confusión sobre la intención del escritor.

Lógica && y || operadores: cortocircuito

&& tiene precedencia sobre ||, esto significa que se colocan paréntesis para evaluar lo que se evaluaría en conjunto.

c ++ utiliza la evaluación de cortocircuito en && y || No hacer ejecuciones innecesarias.
Si el lado izquierdo de || devuelve verdadero el lado derecho no necesita ser evaluado nunca más.

#include <iostream>
#include <string>

using namespace std;

bool True(string id){
    cout << "True" << id << endl;
    return true;
}

bool False(string id){
    cout << "False" << id << endl;
    return false;
}


int main(){
    bool result;
    //let's evaluate 3 booleans with || and && to illustrate operator precedence
    //precedence does not mean that && will be evaluated first but rather where    
    //parentheses would be added
    //example 1
    result =
        False("A") || False("B") && False("C"); 
                // eq. False("A") || (False("B") && False("C"))
    //FalseA
    //FalseB
    //"Short-circuit evaluation skip of C"
    //A is false so we have to evaluate the right of ||,
    //B being false we do not have to evaluate C to know that the result is false
    

    
    result =
        True("A") || False("B") && False("C"); 
                // eq. True("A") || (False("B") && False("C"))
    cout << result << " :=====================" << endl;
    //TrueA
    //"Short-circuit evaluation skip of B"
    //"Short-circuit evaluation skip of C"
    //A is true so we do not have to evaluate 
    //        the right of || to know that the result is true
    //If || had precedence over && the equivalent evaluation would be:
    // (True("A") || False("B")) && False("C")
    //What would print
    //TrueA
    //"Short-circuit evaluation skip of B"
    //FalseC
    //Because the parentheses are placed differently 
    //the parts that get evaluated are differently
    //which makes that the end result in this case would be False because C is false
}

Operadores Unarios

Los operadores unarios actúan sobre el objeto sobre el que son llamados y tienen una alta prioridad. (Ver las observaciones)

Cuando se usa postfix, la acción ocurre solo después de que se evalúa la operación completa, lo que lleva a algunas aritméticas interesantes:

int a = 1;
++a;            // result: 2
a--;            // result: 1
int minusa=-a;  // result: -1

bool b = true;
!b; // result: true

a=4;
int c = a++/2;      // equal to: (a==4) 4 / 2   result: 2 ('a' incremented postfix)
cout << a << endl;  // prints 5!
int d = ++a/2;      // equal to: (a+1) == 6 / 2 result: 3

int arr[4] =  {1,2,3,4};

int *ptr1 = &arr[0];    // points to arr[0] which is 1
int *ptr2 = ptr1++;     // ptr2 points to arr[0] which is still 1; ptr1 incremented
std::cout << *ptr1++ << std::endl;  // prints  2

int e = arr[0]++;       // receives the value of arr[0] before it is incremented
std::cout << e << std::endl;      // prints 1
std::cout << *ptr2 << std::endl;  // prints arr[0] which is now 2


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow