Domanda

Ho appena incontrato questa riga di codice:

if( lineDirection.length2() ){...}

dove length2 restituisce un double. E 'sorta di puzzle di me che 0.0 è equivalente a 0, NULL, e / o false.

E 'questa parte del C ++ standard o è un comportamento indefinito?

È stato utile?

Soluzione

Si tratta di un comportamento molto più standard (booleano Conversione)

  

$ 4.12 / 1 - "Un rvalue di aritmetica,   enumerazione, puntatore, o il puntatore a   Tipo di utente può essere convertito in un   rvalue di tipo bool. Un valore zero,   valore di puntatore nullo, o membro nullo   valore del puntatore viene convertito falso;   qualsiasi altro valore viene convertito in vero ".

Altri suggerimenti

Vale la pena notare che questo codice è estremamente fragile per le rappresentazioni in virgola mobile. Questo codice funziona se e solo se il valore in virgola mobile è esattamente 0, che in realtà è piuttosto improbabile che nella maggior parte dei casi. Esso non può essere in questo caso particolare, ma si dovrebbe certamente essere documentata / commentato in caso affermativo.

In praticamente tutte le altre situazioni è necessario decidere su un epsilon " valore " che definisce l'intervallo di numeri in virgola mobile si considera 'lo stesso' - altrimenti i confronti sono molto propensi a sorprendere in angolo (e spesso non-così-angolo) casi

.

Sì -. Il confronto è contro zero (0.0), e restituisce false se il risultato è esattamente pari a zero, e la vera altrimenti

Il comportamento viene ereditato da C, che tratta il confronto equivalente allo stesso modo.

Quando si confrontano senza di operatori, si confrontano "contro vera", in modo che ogni tipo di variabile viene controllato per essere o booleano (caso semplice) o altro. tipi di variabili numeriche ha valore falso definito come "0", "0.0" o giù di lì, così quando li si confronta "contro vera", il vostro confronto restituisce falso.

Se length2 rendimenti 0.0 sarà preso come false. Ma si potrebbe ottenere risultato sorprendente con questo confronto. Meglio valore d'uso epsilon come MadKeithV suggerito durante il confronto in virgola mobile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top