php - siria - ¿Por qué decrementado de NULL no negativo en este conjunto?
posicion de la onu frente al conflicto en siria (3)
Extraño, pero documented en la página php doc Operadores de Incremento / Disminución:
Nota: Los operadores de incremento / decremento no afectan los valores booleanos. La disminución de los valores NULL tampoco tiene ningún efecto, pero al incrementarlos se obtiene 1.
He probado este código
$a = array_fill(0, 4, NULL);
$a[0]++;
++$a[1];
$a[2]--;
--$a[3];
var_dump($a);
Resultado:
array(4) {
[0]=> int(1)
[1]=> int(1)
[2]=> NULL
[3]=> NULL
}
¿Por qué el valor del índice 2 y 3 no es negativo?
Extraño. No sé cuál es su factor decisivo para esto, pero mirando el código fuente , verá que si se trata de un NULL, lo establece en 1 (no en incremento).
case IS_NULL:
ZVAL_LONG(op1, 1);
break;
La función de decrement no se ocupa de NULL en absoluto y va directamente a FAILURE:
default:
return FAILURE;
Como otros mencionan, está documented .
Nota: Los operadores de incremento / decremento no afectan los valores booleanos. Disminuir los valores
NULL
tampoco tiene ningún efecto, pero aumentarlos da como resultado1
.
Usa la fuente, Luke
Como de costumbre, la respuesta está en la fuente. PHP usa internamente las siguientes dos funciones para realizar las operaciones de incremento y decremento:
ZEND_API int increment_function(zval *op1)
ZEND_API int decrement_function(zval *op1)
Estas operaciones modifican el argumento op1
en función de su tipo ( NULL
es un tipo); Dentro de increment_function()
puedes ver la siguiente rama en el código :
case IS_NULL:
ZVAL_LONG(op1, 1);
break;
El código anterior cambia el tipo de op1
en un número y establece su valor en 1
.
A la inversa, decrement_function()
no ofrece tal rama y, por lo tanto, se realizará la acción predeterminada :
default:
return FAILURE;
La ejecución de este código no producirá ningún error observable, ya que los valores de retorno se absorben en la VM de Zend, pero la variable tampoco se actualiza.
No es un error (tm)
Es posible que se sorprenda al saber que este comportamiento, incluido el de los valores booleanos, está documented :
Nota: Los operadores de incremento / decremento no afectan los valores booleanos. La disminución de los valores
NULL
tampoco tiene ningún efecto, pero al incrementarlos se obtiene1
.
Respecto a los booleanos:
$a = true;
var_dump($a--); // true
$a = false;
var_dump($a++); // false
En cuanto a cadenas:
$letter = ''A'';
var_dump(++$letter); // B
var_dump(--$letter); // B