Ordine dei termini in un'espressione condizionale [duplicato]

2

Considera il seguente ciclo (in Swift - ma la mia domanda è indipendente dalla lingua):

    var index = standardizedTimeSpans.count - 1
    while index >= 0 && timeSpan < standardizedTimeSpans[index] {
        index--
    }
    index++ 

Nel codice precedente, la variabile standardizedTimeSpans è un array di Double e la variabile timeSpan è un Double.

Il ciclo precedente può diminuire il valore dell'indice fino a un massimo di -1. Se la mia espressione condizionale per l'istruzione while è stata ordinata al contrario (cioè timeSpan < standardizedTimeSpans[index] && index >= 0 ), un errore di runtime si verificava con l'array fuori limite nel caso in cui l'indice raggiungesse -1.

La mia domanda:

Questo codice è considerato "sicuro"? In altre parole, esiste il rischio di una modifica del compilatore che non esegua necessariamente la valutazione del condizionale da sinistra a destra? Ovviamente, l'alternativa è valutare le condizioni separatamente e un'espressione di interruzione nel ciclo.

    
posta Dragonspell 23.07.2015 - 23:13
fonte

3 risposte

0

Non sono sicuro di Swift in particolare, ma in generale utilizzo di & & l'operatore cortocircuita e termina in anticipo se il lato sinistro è falso. Il codice dopo il & & non verrà eseguito.

I cortocircuiti sono una pratica corrente in molte lingue.

    
risposta data 23.07.2015 - 23:18
fonte
2

"but my question is language independent"

Ovviamente è dipendente dalla lingua. In qualsiasi linguaggio di programmazione in cui il comportamento di cortocircuito è parte della definizione del linguaggio, il codice è "sicuro". Altrimenti non lo è.

Fortunatamente, qualsiasi serio linguaggio di programmazione delle famiglie linguistiche basate su C che conosco ha un comportamento di cortocircuito "per definizione" (e anche molti altri linguaggi di programmazione). Non conosco Swift, ma dal momento che gli inventori di quella lingua erano professionisti, sono abbastanza sicuro che si preoccupino della retrocompatibilità. Quindi non mi aspetto che il comportamento venga modificato in quella lingua in futuro.

    
risposta data 23.07.2015 - 23:28
fonte
0

my question is language independent

No, non lo è.

Supponiamo che

  • l'ordine di valutazione è ben definito
  • l'ordine di valutazione è da sinistra a destra
  • && è pigro nel suo operando di destra

Tutti e tre sono dipendenti dalla lingua. Ad esempio, in Visual Basic, And è rigoroso in entrambi i suoi operandi.

    
risposta data 24.07.2015 - 00:49
fonte

Leggi altre domande sui tag