Lunes, 17 Diciembre 2007
Hace rato que quería hacer este post. Más que nada, como referencia, porque luego comento esto y no me acuerdo exactamente estas lineas, entonces me es más fácil apuntar a este post y listo.
Si ejecutamos el siguiente script en PHP, intentando sumar 3 y 058...
<?..., el tipo muestra "8".
$r = 3 + 058;
echo $r."n";
?>
Increíble.
Hay que tener cuidado con lo que se dice tan categoricamente.
Creo que una frase mejor sería: "PHP no sabe sumar enteros que empiezan con 0", por que seamos sinceros, todo sabemos, y nos es obvio, de que PHP si sabe sumar.
Capaz esta frase es un poco menos pretenciosa, pero más acertada.
Pero suma es suma así empiece por cero o por cualquier otro número.
La verdad es que falla, bien a este detalle.
Puede ser que no sea el caso de una suma de números naturales pero que tal que ese número se le asigne a un carácter y quieras hacer una operación asignada a este carácter se te va a reventar el aplicativo.
PHP = Para Hacer Paginas
Si fuese Para Sumar, seria PS, no PHP
jaja
:p
python tampoco :-)
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + 010
9
>>>
(si,si, sé porque)
Claudio: En tu ejemplo de Python el número que empieza con cero es un octal válido.
Es un caso de "ambigüedad a la vista", no de ocultar errores y truncar el número sin avisarle a nadie.
Ojo, tampoco me gusta lo de tener esa ambigüedad, y como es algo reconocido que se mantiene por compatibilidad, en la evolución del lenguaje (Python 3) ya no se puede escribir octales de esa manera...
Python 3.0.1+ (r301:69556, Apr 15 2009, 15:59:22)
>>> 1 + 010
...
SyntaxError: invalid token
>>> 1 + 0o10
9
Slds.
>>> 1 + 010
9
¿Porque?
Gracias por desbrutizarme
Marcos: En Python 2, arrancar un número con 0 era la forma de indicar que estaba en octal, por lo que ese 010 (en octal) es un 8 (en decimal), mirá:
>>> 010
8
Esta sintáxis cambió en Python 3, para que "sorprenda menos" (fijate mi ejemplo en el comentario 6).
Muchas gracias Facundo.
Mientras vos escribías tu comentario 6, yo escribía el 7, pensando que era el 6.
Muchas gracias de nuevo por la aclaración sobre esos octales
Estaría bien poner el porque falla ahí PHP como se ha puesto en los ejemplos que lo comentan sobre Python.
Mi teoría es que interpreta el cero a la izquierda como cadena y al hacer la suma unicamente se queda con el último carácter.
Saludos
Shakaran: Lo que hace PHP ahí es encontrar un número que empieza con 0 y lo interpreta como octal (igual que Python 2), y luego se encuentra que tiene un 8, pero en lugar de dar un error porque es un octal inválido, trunca el número ahí y convierte lo que le quedó, dándote basura como si fuera un dato válido (lo que corresponde es generar un error).
Sabe sumar enteros, y tambien en octal :), vos?
058 no es octal. El 8 es basura. Pero se declaró internamente como octal, por lo que internamente se convierte a (int).
var_dump((int)058); da int(5).
Y 3 + 5 = 8.
Prueba con echo 3 + 057; te dará 50, porque 057 octal es igual a 47 decimal ;-)
Raro e imbécil, pero esa es la explicación.
Rodrigo,
Sin ánimo de entrar en polémica, ya sabemos la "explicación". De hecho hay un reporte de bug del año 2004 en b.p.n:
http://bugs.php.net/bug.php?id=29676
La justificacion? corregirlo implicaría que los scripts que usen números correrían más lentos (mirá el reporte del bug).
En cualquier otro Lenguaje de Programación decente un número en notación octal con dígitos fuera de rango da un error.
En Python, Java, C/C++, Ruby escribir "058" da un error de compilación, de interprete o un error numérico.
En PHP ese error pasa desapercibido.
Saludos,
- - -
Bitácora de Vuelo - Facundo Batista - http://www.taniquetil.com.ar/plog
Licencia: Atribución-NoComercial-CompartirDerivadasIgual 2.5 Argentina>