Pregunta

En qué orden están los siguientes parámetros de la prueba (en C++)?

if (a || b && c)
{
}

Acabo de ver este código en nuestra aplicación y la odio, quiero agregar algunos soportes para esclarecer el proceso de pedido.Pero no quiero agregar los soportes hasta que sé que voy a agregar en el lugar correcto.

Editar:Aceptado Respuesta Y Seguimiento

Este enlace tiene más información, pero no es totalmente claro qué significa.Parece que || y && son la misma prioridad, y en ese caso, se evalúan de izquierda a derecha.

http://msdn.microsoft.com/en-us/library/126fe14k.aspx

¿Fue útil?

Solución

De aquí:

a || (b && c)

Esta es la prioridad predeterminada.

Otros consejos

[http://www.cppreference.com/wiki/operator_precedence] (Encontrado por google "C++ precedencia de operadores")

Que página nos dice que &&, en el grupo de 13 años, tiene mayor prioridad que || en el grupo 14, por lo que la expresión es equivalente a a | | b && c).

Por desgracia, el artículo de la wikipedia [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] no está de acuerdo con esto, pero desde que tengo la C89 estándar sobre mi escritorio y está de acuerdo con el primer sitio, voy a revisar el artículo de la wikipedia.

&& (booleano) tiene mayor prioridad que || (booleano O).Por lo tanto, los siguientes son idénticos:

a || b && c
a || (b && c)

Una buena regla mnemotécnica para recordar Y que es como la multiplicación y la O es como la suma.Si reemplazamos Y con * y O con +, obtenemos más familiar equivalente:

a + b * c
a + (b * c)

En realidad, en la lógica Booleana, Y y O acto similar a estos operadores aritméticos:

a  b   a AND b   a * b   a OR b   a + b
---------------------------------------
0  0      0        0       0        0
0  1      0        0       1        1
1  0      0        0       1        1
1  1      1        1       1        1 (2 really, but we pretend it's 1)

Para responder el seguimiento:obviamente la tabla de MSDN es fallido, tal vez por alguien incapaz de hacer una decente tabla HTML (o utilizando una herramienta de Microsoft para generar it!).
Supongo que debería parecerse más a la Wikipedia tabla referenciada por Rodrigo, donde tenemos clara sub-secciones.
Pero, evidentemente, la aceptó respuesta sea la correcta, de alguna manera nos tienen la misma prioridad con && y || que con * y +, por ejemplo.
El fragmento de código que dio es claro y sin ambigüedades para mí, pero supongo que añadiendo entre paréntesis tampoco estaría mal.

No estoy seguro, pero debe ser fácil para que usted se entere.

Basta con crear un pequeño programa con una declaración en la que se imprime el valor de verdad de:(true || false && true)

Si el resultado es true, entonces el || tiene mayor prioridad que &&, si es que falase, es la otra manera alrededor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top