2012-07-02 20 views
5

así que sé que C++ tiene una Prioridad de los operadores y queC/C++ Matemáticas orden de la operación

int x = ++i + i++; 

no está definido porque pre ++ y publicar ++ están al mismo nivel y por lo tanto no hay forma de saber cuál será calcule primero. Pero lo que me preguntaba es si

int i = 1/2/3; 

no está definido. La razón por la que pregunto es porque hay varias maneras de ver eso (1/2)/3 OR 1/(2/3). Supongo que es un comportamiento indefinido, pero me gustaría confirmarlo.

+3

No, no está indefinido. Es (uno dividido por dos) dividido por tres. Es una expresión matemática ordinaria, en otras palabras. –

+0

Creo que su forma de pensar es un poco vaga acerca de la primera y que sangró en su pensamiento sobre la segunda. El primero realmente se reduce al orden de evaluación de los argumentos para que una función no esté definida. Es decir, si lo piensas como 'operador + (++ i, i ++)' entonces salta directamente hacia ti. –

+1

C++ (y la mayoría de los demás lenguajes de programación) tienen un orden de precedencia definido tomado de las matemáticas. No miras una expresión de múltiples maneras; las operaciones matemáticas tienen una jerarquía. Sin embargo, puede cambiar el orden de una operación usando paréntesis (bien colocado). –

Respuesta

5

En su ejemplo el compilador es libre de evaluar "1" "2 "y" 3 "en el orden que quiera, y luego aplique las divisiones de izquierda a derecha.

Pasa lo mismo con el ejemplo de i ++ + i ++. Puede evaluar los i ++ en cualquier orden y ahí radica el problema.

No es que la precedencia de la función no esté definida, sino que es el orden de evaluación de sus argumentos.

17

Si nos fijamos en el C++ operator precedence and associativity, verá que el operador de división es de izquierda a derecha asociativo, lo que significa esto será evaluado como (1/2)/3, ya que:

Los operadores que están en el la misma celda (puede haber varias filas de operadores enumerados en una celda) se evalúa con la misma prioridad, en la dirección dada. Por ejemplo, la expresión a = b = c se analiza como a = (b = c), y no como (a = b) = c debido a la asociatividad de derecha a izquierda.

5

El primer fragmento de código es un comportamiento indefinido porque la variable i se está modificando varias veces entre los puntos de secuencia.

El segundo fragmento de código es un comportamiento definido y es equivalente a:

int i = (1/2)/3; 

como operador / ha de izquierda a derecha asociatividad.

+0

¿Puedes explicar más por qué el primer fragmento de código es un comportamiento indefinido? Da la salida 10 si usa 'i = 4'. Lo siento, soy un novato. – akaHuman

+0

@ shrey347, consulte http://c-faq.com/expr/seqpoints.html – hmjd

2

Se define, que va de izquierda a derecha:

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) { 
    int i = 16/2/2/2; 
    cout<<i<<endl; 
    return 0; 
} 

de impresión "2" en lugar de 1 o 16.

0

Podría decirse que no está definido porque ha elegido un int, que es el conjunto de números enteros. Pruebe un doble o flotador que incluya fracciones.