![]() |
|
| Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
||||
|
||||
|
¿Como se traduce esta instruccion de C a Java?
Hola de nuevo, estoy intentando traducir un programa de C a android pero me he encontrado con una operacion que no conocia y no entiendo como funciona para traducirla a java.
int x += (i=leer_int()) && 1; ¿como interpreta esto el compilador de c? ![]() Muchas gracias y un saludo. David |
|
|
|
#2
|
||||
|
||||
|
Cita:
En C todo lo que no sea 0 es true, y el resultado de evaluar true es 1, no se si me explico. en java queda incluso mas raro: int x += (i=leer_int()) != 0 ? 1 : 0; http://groups.google.es/groups/searc...+gusta+el+C%22 Última edición por pmaicas Día 01/11/11 a las 11:22:13 |
|
#3
|
||||
|
||||
|
Ok, ahora lo veo, pero me he encontrado otras mas raras...
int status = (funcion_void(), !num_int); ¿como se interpreta esto si la funcion es void y no da informacion para evaluar una condicion? |
|
#4
|
||||
|
||||
|
Esta es facil, se evalua la funcion vodi que devuelve void, se evalua la segunda que devuelve int y ese int se asigna a status (bueno, no exactamente, lo que se asigna es 0 o 1 segun el valor devuelto sea distinto de cero o cero, por el !) . No se si java permite escribir lo mismo, pruebalo. Una lista de expressiones separadas por comas simplemente se evaluan una por una de izquierda a derecha.
Hay o había concursos de C 'oscuro' que no me acuerdo como se llamaban, se trata de hacer algo que funcione pero que el código sea imposible de interpretar por un humano |
|
#5
|
||||
|
||||
|
Pues esta última no se si la acabo de entender... voy a probar a compilar varios ejemplos a ver que resultados obtengo.
En esta otra (mira que encuentro código ofuscado XD) según tu anterior explicación se evaluaría primero la función que lee 2 bytes (los lee del propio fichero ifp) y luego evaluaria los siguientes 4 bytes del fichero... ¿pero con qué los compara? ¿es la suma de ambos lo que se suma a j? fseek (ifp, j+(get2bytes(),get4bytes()), SEEK_SET); Este código rompe todas las normas de programación estructurada que conozco. ![]() Y esta ya es la releche desde mi punto de vista int flip = "50132467"[get2bytes() & 7]-'0'; <--- Esa cadena de números sale de la nada intuyo que lee dos bytes de un fichero, hace la comparación binaria con 7 y caso de que el resultado no sea cero ... mi cerebro explota otra vez ![]() Y yo creia que sabía programar en C. |
|
#6
|
||||
|
||||
|
'ofuscado' era ofuscado y no oscuro, no me salía la palabra
![]() Una lista separada por comas simplemente se ejecuta (he dicho antes evalua como sinónimo de ejecutar, no de comparar) de izquierda a derecha, el valor devuelto es el que devuelve la ultima expresion. Es decir que fseek (ifp, j+(get2bytes(),get4bytes()), SEEK_SET); es lo mismo que estas dos lineas: get2bytes(); fseek (ifp, j+get4bytes(), SEEK_SET); Yo nunca uso la lista separada por comas, porque no aporta nada, si quiero usar menos lineas prefiero: get2bytes(); fseek (ifp, j+get4bytes(), SEEK_SET); Para "50132467"[get2bytes() & 7]-'0'; debes tener en cuenta que & es un and aritmético (no lógico), y que ese string es en realidad un array de bytes. Por ejemplo, supongamos que get2bytes devuelva 20, entonces 20 & 7 son 4, y el caracter que ocupa la posicion 4 en el array es '2', y el resultado es '2'-'0' que es 2. El asci de '0' es 48, y el de '2' es 50, por eso el resultado es 2 (no '2', ojo). |
|
#7
|
||||
|
||||
|
Genial, ha sido una lección magistral de C. Muchisimas gracias
![]() Creo que he hecho implementaciones correctas en java de todos esos casos (aún tengo que hacer muchas pruebas) y nunca hubiera podido sin tus explicaciones. Es increíble lo difícil que es encontrar esa información en internet. Igual me he dejado alguna en el tintero, no te alejes mucho que tal vez necesite abusar un poco más de tu conocimiento y paciencia. ![]() Muchas gracias y un saludo. David. |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 22:32:32 (GMT +1)
HTCMania: líderes desde el 2007










