Autor
|
Tema: Diferencias en el código fuente C y C++ (Leído 3,760 veces)
|
theluigy13etv
Desconectado
Mensajes: 179
Primero se hace, después se mejora
|
PRIMERA PREGUNTA:Estaba practicando en Dev-C++ 4.9.9.2 y se me ocurrió implementar un mismo programa en diferentes lenguajes: C y C++. El programa consiste en calcular el factorial de un conjunto de números desde 0 hasta n, donde n lo da el usuario. El código fuente en C++ para el programa lo guardé en un archivo con extensión .cpp y es el siguiente: #include <iostream>
using namespace std;
int main(){ int n; long F; do{ cin>>n; if(n<0) cout<<"El numero es incorrecto!"<<endl; }while(n<0); for(int j=0; j<=n; ++j){ F=1; if(j>1){ for(int i=1;i<=j;++i){ F*=i; } } cout<<j<<"! = "<<F<<endl; } return 0; }
El código fuente en C para el mismo programa lo guardé en un archivo con extensión .c y es el siguiente: #include <stdio.h>
int main(){ int n, i, j; long F; do{ scanf("%i", &n); fflush(stdin); if(n<0) printf("El numero es incorrecto!\n"); }while(n<0); for(j=0; j<=n; ++j){ F=1; if(j>1){ for(i=1; i<=j; ++i){ F=F*i; } } printf("%d! = %ld\n", j, F); } return 0; }
Lo compilé y si me funcionó. Luego lo que hice fue revisar cuánto pesaba cada uno de los archivos ejecutables generados luego de compilarlos y me dio los siguientes resultados: El primer ejecutable (del programa hecho en C++) pesaba 464 KB y el segundo ejecutable (del programa hecho en C) pesaba 15.4 KB. Me pregunto entonces: ¿Tanto es la diferencia de 448.6 KB? ¿Alguien sabrá como explicar esto?SEGUNDA PREGUNTA:Quise averiguar el tamaño de los tipos de datos con los que trabajaba en mi compilador. Así que primero en un archivo .cpp escribí el código siguiente: #include <iostream>
using namespace std;
int main(){ cout<<sizeof(short)<<endl; cout<<sizeof(int)<<endl; cout<<sizeof(long)<<endl; cout<<sizeof(long long)<<endl; return 0; }
Y me arrojó de salida lo siguiente: 2 4 4 8
Si es que el tipo int y el tipo long ocupan el mismo tamaño en la memoria, entonces ¿de qué me sirve el long si me basta el int? Algo similar hice pero en un archivo .c #include <stdio.h>
int main(){ printf("%hd\n", sizeof(short)); printf("%d\n", sizeof(int)); printf("%ld\n", sizeof(long)); printf("%ld\n", sizeof(long long)); return 0; }
Y me arrojó de salida lo siguiente: 2 4 4 8
Entonces mi pregunta aquí es la misma: ¿de qué me sirve el long si me basta el int? Y otra: ¿No sabía que el tipo long long existía en C? Espero sus comentarios, sus respuestas y sus críticas.
|
|
« Última modificación: 27 Enero 2012, 23:01 pm por theluigy13etv »
|
En línea
|
|
|
|
theluigy13etv
Desconectado
Mensajes: 179
Primero se hace, después se mejora
|
Me olvidaba, para los que me quieran criticar por el uso de fflush(stdin), ya leí las recomendaciones que hicieron en varias ocasiones sobre que no se debe usar con stdin sino exclusivamente con stdout. Para este ejemplo he obviado esto, pero sé que está mal usarlo. Y otra cosa, necesito saber si mi código está bien escrito en lenguaje C++ puro el primero y en lenguaje C puro el segundo, y algunas otras sugerencias, quiero desde el principio poder diferenciar ambos lenguajes para no mezclarlos demasiado. Gracias.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Algunos detalles a considerar sobre el programa en C ... * Si solo vas a imprimir una cadena literal terminada con '\n' utiliza la función "puts" en lugar de "printf". * Procesas el caso especial dentro del bucle, si vas a hacerlo hazlo afuera ya que en cada iteracion se debe verificar si la variable es mayor que uno. * Si lo piensas un poco no es necesaria esa verificación. El programa modificado es: #include <stdio.h> #include <stdlib.h> int main() { int num; int i; int j; long fact; do { if (num < 0) puts("El numero es incorrecto!"); }while (num < 0); for (i = 0; i <= num; i++){ fact = 1; for (j = i; j > 1; j--) fact *= j; printf("%2d! = %ld\n", i , fact ); } return EXIT_SUCCESS; }
* En cuanto al tamaño de los ejecutables es una pregunta frecuente, puedes empezar revisando los temas en este foro sobre "reducir el tamaño del ejecutable", también puedes revisar la FAQ de C++ (en ingles, utiliza Google). * Los rangos máximos dependen del compilador, ellos se definen en los encabezados <limits.h> y <float.h>. * El tipo "long long" se agrego con el estándar C99. Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
eleon
Desconectado
Mensajes: 99
|
Buenas:
A parte de lo que te ha comentado rir3760 deberías, sobre lo del tamaño se debe a cómo incluyes las librerías, esto es, existen dos modos:
Librería estática: Se incluye en el ejecutable final todas las librerías que has usado en el programa. Librería dinámica: No se incluyen las librerías sino que se añade información sobre dónde están situadas en el PC y al procesar el ejecuta ble se buscan las librerías y para usar las funciones.
Lógicamente si compilas con el modo "librería estática" el ejecutabe pesará más ya que se incluye la librería completa, pero esto tiene la ventaja de que si llevas el programa a otro PC no tendrás problemas de que en dicho PC no estén las librerías ya que ya van dentro del ejecutable.
Fíjate si el compilador en C te pone por defecto librería dinámica y en C++ librería estática.
Sobre el tamaño de las variables eso es en tu caso, con tu procesador y compilador, son ellos dos los que deciden qué tamaño debe tener cada tipo, en otro PC serán otros tamaños, de lo único que se puede estar seguro es que el "short int" es de menor tamaño que el "int" y este a su vez menor que el "long int".
Saludos.
|
|
|
En línea
|
|
|
|
theluigy13etv
Desconectado
Mensajes: 179
Primero se hace, después se mejora
|
Buenas:
A parte de lo que te ha comentado rir3760 deberías, sobre lo del tamaño se debe a cómo incluyes las librerías, esto es, existen dos modos:
Librería estática: Se incluye en el ejecutable final todas las librerías que has usado en el programa. Librería dinámica: No se incluyen las librerías sino que se añade información sobre dónde están situadas en el PC y al procesar el ejecuta ble se buscan las librerías y para usar las funciones.
Lógicamente si compilas con el modo "librería estática" el ejecutabe pesará más ya que se incluye la librería completa, pero esto tiene la ventaja de que si llevas el programa a otro PC no tendrás problemas de que en dicho PC no estén las librerías ya que ya van dentro del ejecutable.
Fíjate si el compilador en C te pone por defecto librería dinámica y en C++ librería estática.
Sobre el tamaño de las variables eso es en tu caso, con tu procesador y compilador, son ellos dos los que deciden qué tamaño debe tener cada tipo, en otro PC serán otros tamaños, de lo único que se puede estar seguro es que el "short int" es de menor tamaño que el "int" y este a su vez menor que el "long int".
Discúlpame eleon, no te entendí mucho eso de las librerías estáticas y dinámicas, así que voy a documentarme más acerca de esto, y gracias. Ahora lo que quería preguntar era que en mi PC el "int" y el "long int" pesan ambos 4 bytes, pareciera como que si pesan lo mismo, entonces uno de ellos saldría sobrando?. Espero comentarios. Para rir3760: Hola, probé tu código y si funcionaba, lo que me pregunto es para el caso que i = 0 pareciera que tu código no debería funcionar pero sí lo hace. Por ejemplo en la parte que pones: for (i = 0; i <= num; i++){ fact = 1; for (j = i; j > 1; j--) fact *= j; printf("%2d! = %ld\n", i, fact); }
Si es que i=0, cuando entra al bucle for, asigna a j=i (osea cero) y luego dice hasta que j>1. Pero 0 no es mayor que 1, osea, ¿Cómo es que j puede retroceder desde 0 hasta mayor que 1? Esta parte me intriga un poco. Espero tu Ayuda. Lo segundo es esto: printf("%2d! = %ld\n", i, fact); Aquí pones en la parte de la especificación de conversión a entero siguiente "%d", pones el 2 en medio, ¿Me pregunto que es lo que permite hacer esto? Lo tercero es respecto al valor de devolución al final, en la sentencia return: return EXIT_SUCCESS; Siempre he visto que han devuelto el 0, y lo aplico siempre aunque nunca he comprendido el porqué. Por allí leí que indica que el programa termina con éxito. En otros lados e leído que para que el programa empiece a funcionar, el sistema operativo invoca a main, y a final, main le devuelve el número 0 al sistema operativo indicándole que el programa terminó con éxito. Pero hasta ahora nunca me he podido percatar que el programa falle o que termine sin éxito, siempre he visto que termina. Gracias por la ayuda!!!
|
|
|
En línea
|
|
|
|
satu
Desconectado
Mensajes: 301
Siempre aprendiendo
|
Hola for (i = 0; i <= num; i++){ fact = 1; for (j = i; j > 1; j--) fact *= j; printf("%2d! = %ld\n", i , fact ); }
Si es que i=0, cuando entra al bucle for, asigna a j=i (osea cero) y luego dice hasta que j>1. Pero 0 no es mayor que 1, osea, ¿Cómo es que j puede retroceder desde 0 hasta mayor que 1? No es que retroceda desde 0 hasta mayor que 1, simplemente no cumple la condición del for y no entra, por lo que fact vale 1. Lo tercero es respecto al valor de devolución al final, en la sentencia return: return EXIT_SUCCESS;
Siempre he visto que han devuelto el 0, y lo aplico siempre aunque nunca he comprendido el porqué. Por allí leí que indica que el programa termina con éxito. En otros lados e leído que para que el programa empiece a funcionar, el sistema operativo invoca a main, y a final, main le devuelve el número 0 al sistema operativo indicándole que el programa terminó con éxito. Pero hasta ahora nunca me he podido percatar que el programa falle o que termine sin éxito, siempre he visto que termina. El return 0 indica al SO si el programa se ha ejecutado con éxito. Si por ejemplo tú creas un programa con un bucle infinito, al cerrarlo, el SO sabrá que algo ha fallado porque no recibe ese 0, ya que no se ha ejecutado entero y no ha devuelto el 0. En Windows 7 cuando pasa algo "raro" el propio SO te avisa de que el programa no funciona bien y debe cerrarse. Para eso es ese return 0 o return EXIT_SUCCESS. En cuanto a lo que preguntas de los tamaños de int y long int no tengo ni idea. Saludos
|
|
|
En línea
|
Breakbeat como forma de vida
|
|
|
|
|