Perché (0 <5 <3) restituisce true?

Stavo giocando in jsfiddle.net e sono curioso di sapere perché questo ritorna vero?

if(0 < 5 < 3) { alert("True"); } 

Così fa questo:

 if(0 < 5 < 2) { alert("True"); } 

Ma questo non:

 if(0 < 5 < 1) { alert("True"); } 

È mai utile questa stranezza?

Le cause dell’ordine di operazioni (0 < 5 < 3) devono essere interpretate in javascript as ((0 < 5) < 3) che produce (true < 3) e true viene conteggiato come 1, causando il ritorno true.

Questo è anche il motivo per cui (0 < 5 < 1) restituisce false, (0 < 5) restituisce true, che viene interpretato come 1 , risultante in (1 < 1) .

La mia ipotesi è perché 0 < 5 è vero, e true < 3 ottiene cast a 1 < 3 che è vero.

probabilmente perché true è assunto come 1 così

 0 < 5 < 3 --> true < 3 --> 1 < 3 --> true 

Perché true < 3 , perché true == 1

Per quanto riguarda la tua domanda se questa stranezza è sempre utile: suppongo che potrebbe esserci qualche caso in cui sarebbe utile (se il codice condensato è quello che stai cercando), ma affidarsi ad esso (molto probabilmente) ridurrà drasticamente la comprensibilità del tuo codice.

È un po ‘come usare post / pre incremento / decremento come parte di espressioni più grandi. Riesci a determinare quale risultato di questo codice è a colpo d’occhio?

 int x = 5; int result = ++x + x++ + --x; 

Nota: con questo codice, a volte è ansible ottenere risultati diversi a seconda della lingua e del compilatore.

È una buona idea rendere la vita facile per te e il prossimo che leggerà il tuo codice. Scrivi chiaramente cosa vuoi realmente accadere piuttosto che fare affidamento su effetti collaterali come la conversione implicita dei booleani.

La risposta alla seconda parte della domanda, “è questa stranezza mai utile?” forse no, come notato da una risposta precedente, se è davvero una stranezza del linguaggio (Javascript) che true è lanciato su 1, ma che il programmatore non ha in generale la vista 1 e true (e 0 e false) come stessa cosa.

Se tuttavia hai un modello mentale di 1 che è vero e 0 che è falso, allora porta a tutti i tipi di belle tecniche booleane che sono estremamente utili, potenti e dirette. Ad esempio, è ansible incrementare un contatore direttamente con il risultato di A> 100, che incrementerebbe il contatore se A è maggiore di 100. Questa tecnica potrebbe essere vista come una stranezza o un trucco in Java, ma in un array o in un linguaggio funzionale può essere idiomatico

Un classico esempio nel linguaggio APL dell’array sarebbe quello di contare il numero di elementi in un array che sono (diciamo) maggiori di 100:

 +/A>100 

Dove se A è l’array di 5 elementi 107 22 256 110 3 quindi:

 A>100 

produce la matrice booleana di 5 elementi:

1 0 1 1 0

e sumndo questo risultato booleano:

 +/1 0 1 1 0 

produce la risposta finale:

3

Questa domanda è un perfetto esempio di dove questa tecnica sarebbe molto utile, specialmente se il problema è generalizzato per determinare se n fuori da valori booleani sono veri.

Controlla se almeno due dei tre booleani sono veri

Questo è facile.

 (0 < 5 < 3) 

Inizia da sinistra a destra in modo da valutare il primo 0 <5. È vero? Sì. Poiché TRUE = 1, valuta 1 <3. Poiché 1 è inferiore a 3, è vero.

Ora con questo

  (0 < 5 < 1) 

0 meno di 5? Sì. Quindi rendilo VERO, il che significa anche 1. Ora, tenendo presente questo fatto, esso valuta (1 <1). È 1 in meno di 1? No, quindi è falso. Deve essere uguale

sta valutando 0 <5 che restituirebbe 1 per vero quando 1 <3 che è vero?

C # vuoi farti fare questo “Operatore ‘<' non può essere applicato agli operandi di tipo 'bool' e 'int'"

Mi sono imbattuto poco fa in Obj-C e ne sono rimasto molto perplesso. Ho ottenuto i risultati che volevo facendo qualcosa del genere:

 if(0 < 5 && 5 < 3) { alert("True");} 

Che, naturalmente, è falso, quindi non otterresti un avviso "vero". Sono contento di aver letto questo, ora so perché.

Oltre a Python, CoffeeScript è un altro linguaggio che supporta confronti concatenati, quindi 3 < x < 10 verrebbero convertiti in (3 < x && x < 10) in JS vaniglia

 0 < 5 < 3 ==> ( ( 0 < 5 ) < 3 ) ==> true < 3 ==> 1 < 3 ==> true 

Un operando booleano quando operato su un operatore matematico restituisce un numero. per controllare questo facciamo

 true + 1 which gives you 2. 

Quindi 0 < 5 , il booleano restituito (true) gestito con l'operatore matematico (<) restituirà un numero. Quindi si riduce a 1 <3 che restituisce true

perché 0 è inferiore a 5 quindi restituisce true e per impostazione predefinita true è tutto compreso e può essere valutato su 1 che è ancora inferiore a 3 che restituisce di nuovo true