Precedenza operatori logici

di il
2 risposte

Precedenza operatori logici

Rispondendo ad un altro topic, mi è sorto un dubbio.

Assodato che:
- la valutazione a corto circuito prevede che il secondo operando viene valutato soltanto se esso da solo non è sufficiente a determinare il risultato dell'espressione logica. Quindi in A&&B se A è falso B non viene valutato e in A||B se A è vero B non viene valutato;
- l'operatore && ha la precedenza sull'operatore ||.

Consideriamo quindi l'espressione:

A || B && C

Stando alla precedenza degli operatori dovrebbe essere valutata prima l'espressione B&&C (chiamiamo tale risultato D) e poi l'espressione A||D. Poi all'interno della valutazione delle due espressioni elementari si applica ovviamente il corto circuito.

Consideriamo ora il seguente esempio:
int A = 1;
int B = 0;
int C = 0;
cout << (A || ++B && C) << " " << B;
stando a quanto detto prima l'output dovrebbe essere
1 1
Dal momento invece che l'output è
1 0
significa che viene valutata prima l'espressione A||++B e che per il corto circuito, essendo A vero, l'operando ++B non viene proprio valutato.

Come si spiega questa apparente contraddizione tra teoria ed evidenza?

2 Risposte

  • Re: Precedenza operatori logici

    Cosa intendi per contraddizione? Il risultato di (X || Y && Z) è comunque uguale a (X OR (Y AND Z)) per qualsiasi X,Y,Z e la norma non parla di obbligo di valutazione, altrimenti non esisterebbero gli operatori short-circuit
  • Re: Precedenza operatori logici

    Credo di aver capito dov'è il problema, il mio ragionamento si basa su una premessa errata. Credevo che la valutazione a corto circuito si applicasse soltanto alle espressioni elementari, ossia del tipo
    operando operatore_logico operando
    e non a
    operando/sottoespressione operatore_logico operando/sottoespressione
    Si deduce quindi che la valutazione dei singoli operandi, anche se qualcuno può essere saltato, avviene sempre da sinistra verso destra.

    Quindi un'espressione del genere
    ptr1 == NULL || ptr2 != NULL && *ptr1 > *ptr2
    risulta corretta.
Devi accedere o registrarti per scrivere nel forum
2 risposte