2012-02-22 7 views
5

Estaba trabajando en los conceptos básicos de C y estaba tratando de resolver el problema a continuación. ¿Alguien podría explicar por qué la salida de la variable c es diferente?¿Por qué c no se incrementa en la salida?

¿Cuál es la salida del siguiente programa?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

Ans: -2, 3, 0, 1

¿Por qué c no se incrementa en la salida?

+1

d = ((-2 && 3) || (++ c)). Está en cortocircuito antes de que llegue a c. –

+0

¿Qué estás tratando de hacer realmente? ¿O simplemente estás jugando con algún código? – Bart

+0

simplemente resolviendo c rompecabezas – Nisha

Respuesta

10

La variable c no se incrementa porque el RHS (lado derecho) de un || no se ejecuta a menos que el LHS lo evalúe como falso y el LHS lo evalúe como verdadero. Los operadores C || y && son operadores de 'cortocircuito'; no evalúan el segundo operando a menos que el primero sea insuficiente para determinar la verdad general de la expresión.

El && se une más apretado que el ||, por lo que la operación se puede paréntesis como:

d = (++a && ++b) || ++c; 

El valor de ++a es -2, que evalúa a verdadero (porque cualquier valor que no es 0 se evalúa como verdadero); el valor de ++b es 3, que se evalúa como verdadero; por lo que el valor del término && es verdadero. Debido a que true || false y true || true ambos evalúan a true, no hay necesidad de evaluar el RHS para conocer el resultado general. (La regla análoga para && es que si el primer término se evalúa como falso, no es necesario evaluar el segundo porque la expresión general debe ser falsa. Si tenía a = -1; antes de la prueba, entonces b no se incrementaría, porque ++a ser cero o falso, por lo que el RHS de la && es sin evaluar. Por supuesto, a continuación, c sería incrementa debido a que el LHS del || sería falso, y el RHS tendría que ser evaluados para determinar el resultado global.)

+2

Quizás él no entienda cómo -2 y 3 se evalúan como verdaderos. –

+0

@ 0A0D: He comentado sobre eso - puede estar en lo cierto. –

9

Porque ++a && ++b evalúa a true.

Se llama cortocircuito. Las expresiones dentro de las condiciones se evalúan de izquierda a derecha. Si es su caso, si la primera condición en la cláusula OR se evalúa a true, no tiene sentido que la segunda también se evalúe, ya que se sabe que la expresión completa es true.

2

En C, los operadores lógicos booleanos && y || son short-circuiting. Esto significa que solo evalúan su lado derecho, si evaluar el lado izquierdo no es suficiente para saber la respuesta.

Para su código, esto tiene el efecto de nunca evaluar ++c, ya que el lado izquierdo no es cero y, por lo tanto, el resultado del booleano será verdadero, y no hay necesidad de hacer más trabajo.

2

Es evaluación de expresiones booleanas perezosas. La ejecución es:

++a da -2

++b da 3

-2 && 3 da 1

Está bien! No es necesario verificar el resultado de ||. Por lo tanto, ++c no se evalúa.

La regla es: parte X expresión no se evalúa en los casos: (0 && X), (1 || X). Aquí 1 es "no 0", por supuesto.

2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

Eso es más o menos la forma en que trabaja detrás de la escena ...

Cuestiones relacionadas