function haha($lol)
{
if($lol) { echo "plus"; }
else { echo "minus"; }
}
haha (-1) echi più.
È perché PHP utilizza due complementi? La ricerca su Google non è stata molto utile.
PHP eredita molte delle sue decisioni di progettazione come questa da Perl. Perl prese in prestito idee largamente, ma quasi certamente prese questa idea particolare da C. C la ereditò da B.
B non aveva diversi tipi di dati come int, boolean, ecc, ma piuttosto operava solo su slot di memoria, e l'interpretazione di ogni slot dipendeva da quali istruzioni erano usate su di esso, quindi doveva usare alcune regole fisse per la conversione un po 'di schema in booleano, e quello che ha scelto era tutto zero è falso, tutti gli altri veri.
B era un derivato di BCPL, che aveva un sistema di tipo simile, ma diverge dalla definizione dei valori di verità di BCPL (che ha la stessa definizione di false, ma richiede true per avere tutti i bit impostati, ovvero -1 se interpretato come firmato intero complemento 2). BCPL lascia il risultato dell'uso di qualsiasi altro valore non specificato.
È probabile che l'approccio di B sia stato influenzato dall'insieme di istruzioni sul PDP 7 per cui è stato originariamente progettato. Il PDP 7 forniva istruzioni che eseguivano condizionatamente l'istruzione successiva se il suo registro di accumulatore era zero o non zero, che sarebbe eseguito in un singolo ciclo. Test per l'uguaglianza con qualsiasi altro valore richiesto più cicli. Aveva anche un'istruzione ISZ (incrementa e salta se zero) che può gestire in modo molto efficiente cicli che contano fino a zero, un idioma reso semplice se i numeri diversi da zero sono veri:
c = -8;
do { ... } while (++c);
Non so specificamente di PHP, (ew,) ma in tutte le lingue che conosco che consentono conversioni implicite (ew,) o esplicite tra numeri e booleani, vale quanto segue:
E i numeri negativi sono diversi da zero.
Questo non ha nulla a che fare con il complemento a due.
Non sono sicuro del motivo preciso per cui è così, ma se ci pensate, se non fosse così, allora cosa vorreste che fosse? Numeri positivi rispetto ai numeri non positivi? Ciò richiederebbe il trattamento di -1 allo stesso valore di 0 (dato che 0 dovrebbe ovviamente significare false
,) e questo è asimmetrico; sembra blasfemo; malvagio.
Suppongo che ci siano altri motivi che hanno a che fare con la semplicità che è inerente alla simmetria. Ad esempio, se calcoli la differenza tra due numeri A
e B
, questo sarà un numero negativo se A < B
, zero se A == B
e un numero positivo se A > B
. Ma se visualizzi la differenza come booleano, allora automaticamente hai il valore dell'espressione A != B
, indipendentemente da >
o <
. È una cosa utile da avere.
Quando ho letto per la prima volta questa domanda, qualcosa mi ha infastidito, ma non riuscivo a capirci qualcosa.
Questa mattina mi sono reso conto che quello che mi ha infastidito è che alcune persone potrebbero farlo, convertendo numeri in valori booleani. Forse l'OP lo stava facendo solo come esercizio accademico, ma IMHO non dovrebbe mai essere fatto in pratica.
Questo ammonimento da MSDN lo riassume bene, "... Non dovresti mai scrivere codice che si basa su valori numerici equivalenti per True e False. Quando possibile, devi limitare l'uso delle variabili booleane ai valori logici per i quali sono progettata ".
Google search wasn't really helpful.
Questo non ci è voluto molto tempo per trovare. Dal link :
When converting to boolean, the following values are considered FALSE:
- the boolean FALSE itself
- the integer 0 (zero)
- the float 0.0 (zero)
- the empty string, and the string "0"
- an array with zero elements
- an object with zero member variables (PHP 4 only)
- the special type NULL (including unset variables)
- SimpleXML objects created from empty tags
Every other value is considered TRUE (including any resource).
Warning: -1 is considered TRUE, like any other non-zero (whether negative or positive) number!
Leggi altre domande sui tag php evaluation boolean