2012-05-06 12 views

risposta

7

PHP non è C, quindi 'a' + 1 non è 'b'.

'a' in un contesto numerico è 0 e 0+1 = 1.

php> echo (int)'a'; 
0 

Il fatto che gli operatori di incremento postfix/prefisso fanno lavoro come se fosse un char C sembra essere una "caratteristica" brutto di PHP. Soprattutto perché gli operatori decrementali sono in questo caso non operativi.

Quando si incrementa 'z' Diventa ancora peggio:

php> $a = 'z'; 
php> echo ++$a 
aa 
+0

Cosa intendi con? : "Specialmente dal momento che gli operatori decrementano in questo caso i no-op". – Shubham

+1

In realtà, non lo chiamerei necessariamente strano. Sta essenzialmente seguendo le regole matematiche standard usando una base di 25 (con lettere anziché numeri). – Mario

+0

@Shubham "No-op" significa "nessuna operazione", cioè non accade nulla. È spiegato qui poco prima del primo esempio: http://php.net/manual/en/language.operators.increment.php – Mario

1

Il motivo è PHP trattare variabili in modo specifico contesto. È un po 'simile a Visual Basic.

L'espressione 'a' + 1 utilizza l'aggiunta matematica. In questo contesto, a viene interpretato come un numero, quindi verrà considerato 0 (se hai familiarità con C, è come inserire la stringa "a" in atoi()).

Se si utilizza l'espressione 'a' . 1 il risultato sarebbe a1 a causa di esso mediante concatenazione di stringhe.

Per ottenere il risultato previsto (b), è necessario utilizzare chr(ord('a') + 1), dove ord() restituisce esplicitamente il valore ASCII del (primo) carattere.

$a++ è un caso speciale, essenzialmente un sovraccarico che considera il valore ASCII invece del valore stesso come variabile.

0

Quando si esegue un'aggiunta, PHP tenta di convertire 'a' in un numero intero. Proprio come se si usasse atoi in C, 'a' è interpretato come 0. Pertanto 0 + 1 è 1.

+0

Sì, ma perché '$ a ++' cambia il valore di '$ a' in' b' e non '1'? – JJJ

+0

L'incremento non è la stessa operazione dell'aggiunta. PHP segue la convenzione di Perl. Vedi questo: http://php.net/manual/en/language.operators.increment.php – root

1

Da http://php.net/manual/en/types.comparisons.php, "a" +1 viene eseguito come 0 + 1. Dove alcune lingue (C#) traducono (stringa) + (int) in (stringa) + (stringa), PHP fa il contrario: (int) + (int).

Per forzare la concatenazione di stringhe: "a" . 1 restituisce 'a1'.

Problemi correlati