2012-01-05 22 views
6

Percorrendo EASTL, ho inciampato attraverso una linea particolare di codice. Il link seguente mostra il file con il numero di riga di interesse al 1870.Qual è la differenza tra! (X < y) and x > = y in C++?

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

Il codice a quella riga è if(!(value < *i)). Il commento dice che "esprimiamo sempre confronti di valore in termini di < o ==" senza alcuna spiegazione sul motivo per cui è così. Ci sono anche alcune altre aree in cui viene inserito lo stesso commento ma senza alcuna spiegazione

C'è qualche vantaggio per scrivere un confronto del genere (forse così contesto che sto trascurando)? Altrimenti, perché l'autore di EASTL l'ha deliberatamente scritto in questo modo particolare e si è anche preso la briga di commentarlo? La coerenza è l'unica ragione qui?

+1

In virgola mobile, sono diversi, poiché il confronto con 'NaN' restituirà sempre falso. – Mysticial

+0

Perché non glielo chiedi? –

+0

Sembra un ottimizzazione del processore/assemblatore/compilatore molto specifica. Questo codice è mirato ad un particolare processore/compilatore ecc. –

risposta

11

Significa che è necessario fornire solo < e == per i tipi di valore del contenitore. Significa anche ridurre la quantità di variabilità per questi tipi (poiché tutti gli algoritmi utilizzano !(a<b) per indicare a>=b e !(a==b) per a!=b); in caso contrario, è possibile che >= e != restituiscano risultati incoerenti.

8

In C++, è possibile sovraccaricare l'operatore < in modo che si comporti in modo diverso rispetto al contrario di >=, quindi non è garantito che sia equivalente.

Inoltre, in qualsiasi implementazione IEEE in virgola mobile, NaN < NaN è falso, ma così èNaN >= NaN, così !(NaN < NaN) è vero anche se NaN >= NaN è falso.

1

Vedo almeno una differenza. Se uno dei numeri fosse QNAN (floating-point 0/0) allora! (Uno < b) avrebbe sempre restituito TRUE se uno qualsiasi di aeb era QNAN, mentre avrebbe sempre restituito false per a> = b

+0

In realtà, questo comportamento è abbastanza fastidioso. Una delle proprietà di '<, matematicamente è l'anti-simmetria. Significa che '! (A

+0

@SteveJessop: sì, mi dispiace, è un po 'fuori. La vera relazione è: '! (A a == b'. –

+0

@Matthieu: Vero è fastidioso, ma la definizione di antisimmetria è disattivata. Si consideri' a == b', quindi '!(a

1

Utilizzando solo l'operatore minore di, è possibile simulare tutti gli altri operatori di confronto. Ciò lo rende più coerente e consente di utilizzare un singolo parametro di modello quando è necessario parametrizzare il confronto. I contenitori e gli algoritmi ordinati standard utilizzano std::less<T> come comparatore di modelli predefinito, ad esempio.

operation equivalent 
x < y  x < y 
x > y  y < x 
x <= y  !(y < x) 
x >= y  !(x < y) 
x == y  !(x < y) && !(y < x) 
x != y  (x < y) || (y < x) 

Per quelle operazioni in cui ordine non è importante è più semplice e più efficiente di utilizzare operatore == invece.

+0

La libreria standard usa anche 'equal_to (==)' per il controllo di uguaglianza. – visitor

Problemi correlati