Manejar variables en C cuando trabajas con varios archivos es un aspecto crucial de la programación en este lenguaje. Las variables externas, o extern, te permiten compartir variables entre diferentes archivos, lo que facilita la cooperación entre varios componentes de un programa. Veamos cómo puedes implementar esto de manera efectiva.
Declaración y definición de variables externas
Cuando declaramos una variable como extern, estamos indicando que la variable está definida en otra parte, posiblemente en otro archivo. No es suficiente con solo inicializarlas, sino que también debes definirlas.
// Ejemplo de declaración de variables externasexternint a, b, c;// Definición de variablesint a, b, c;
En el ejemplo anterior, primero indicamos que las variables a, b y c existen en otro lugar. Luego, definimos las variables en el archivo adecuado para poder utilizarlas en nuestro programa.
Beneficios y cuidados a tener con las variables externas
Las variables externas te ofrecen la ventaja de compartir datos entre archivos sin necesidad de volver a declarar o inicializar constantemente. Sin embargo, es importante recordar que estas variables deben ser manejadas con cuidado para evitar conflictos o errores complejos.
Usos y experimentos con límites de variables
Ahora que sabemos cómo declarar y definir variables, realicemos algunos experimentos con los límites de las mismas. ¿Qué ocurre cuando sumamos valores extremos o cuando superamos el rango permitido?
// Ejemplo de comportamiento al exceder el límiteint valor = INT_MAX;valor +=1;// Excede el límite positivo
En este caso, es posible que el valor se desborde y produzca comportamientos inesperados. Algo similar ocurre si aplicas operaciones que llevan la variable al límite negativo.
¿Cómo trabajar con decimales en C?
Cuando trabajamos con números flotantes (decimales) en C, es fundamental entender cómo opera con la precisión de los decimales. Esto es crucial para cálculos que dependen de alta precisión.
Visibilidad de precisión decimal
Al imprimir decimales, utilizamos %f para representarlos. Por defecto, C nos da seis cifras decimales de precisión.
// Ejemplo de suma de decimalesfloat g =1.1111, f =1000.999;float h = g + f;printf("%.6f", h);// Mostrará 1002.110100
Pérdida de precisión en cálculos
A pesar de recibir varias cifras decimales, tienes que ser consciente de que las operaciones pueden llevar a pérdida de precisión si las variables no se manejan adecuadamente. Esto es una limitación inherente del lenguaje.
float precisionReduce =0.111111;precisionReduce +=999999.999999;printf("%.6f", precisionReduce);// Redondeará a seis decimales
En este escenario, el lenguaje C podría no lanzar un error, pero se perderá precisión. Esto se debe al hecho de que el lenguaje C fue diseñado sin las facilidades de gestión mejoradas para variables.
Implicaciones y mejores prácticas en el uso de C
Aprender a trabajar con variables en C, tanto externas como internas, es fundamental para maximizar la eficiencia de tu código. Aquí te dejamos algunas mejores prácticas:
Siempre verifica los rangos de variables. Mantente atento a los posibles desbordamientos.
Asegúrate de separar la declaración de variables de la definición. Esto evita errores en tiempo de compilación.
Utiliza herramientas externas para monitorear la precisión de tus cálculos. Con extensiones o depuradores puedes evitar problemas potenciales.
Finalmente, es importante recordar que el lenguaje C, a pesar de sus limitaciones, sigue siendo una herramienta potente para los programadores. La clave está en entender sus peculiaridades y cómo manejarlas a nuestro favor. Sigue explorando, experimentando y aprendiendo, pues cada nueva aplicación es una oportunidad para profundizar tus conocimientos. ¡Nos vemos!
Para aquellos a los que no le haya quedado claro qué es una variable y cual es la sintaxis correcta para declararla en C, les comparto esta breve explicación:
Una variable es un espacio de memoria reservado (en RAM), cuyo tamaño depende del tipo de dato que se quiere almacenar. A dicho espacio reservado podemos asignarle un nombre, para referirnos mucho más fácil a la dirección de memoria donde se encuentra, o al valor que almacena. Los datos contenidos en una variable, al estar cargados en la memoria RAM, desaparecerán una vez el computador se apague.
Debido a que C es un lenguaje fuertemente tipado, es necesario declarar el tipo de datos que va a contener una variable desde el momento de la declaración. La sintaxis (forma correcta de escribir en un lenguaje) para declarar una variable en C es la siguiente
char letra;
donde char representa el tipo de datos (caracter), letra es el nombre que le asignamos a la variable, y el ; representa el final de la instrucción. En este ejemplo, hemos reservado 1 byte para almacenar nuestros datos, sin embargo, no se le ha asignado ningún valor aún. Si quisiéramos declarar una variable e inmediatamente guardar un dato en ella podríamos hacerlo usando la sintaxis:
char letra='a';
a será el valor que almacena la variable, y se encuentra entre comillas sencillas para indicar que es un caracter.
Finalmente cabe aclarar que podemos asignar cualquier nombre a una variable, teniendo en cuenta estas restricciones:
No debe empezar por un número
No debe ser igual a una palabra reservada del sistema, es decir, palabras definidas previamente por el lenguaje para ejecutar acciones especiales
Deben ser significativos, es decir, que describan claramente lo que están almacenando. Ej. Para almacenar la cantidad de estudiantes de un curso, podriamos llamar a la variable alumnos
Espero a alguien le sirva.
Entonces podemos desbordar o violar los segmentos de la RAM si declaramos muchas variables long double?
Gracias por tu aporte
Me quedé loco cuando vi el doble int y volví a la clase pasada a ver si me salté algo jajaja ke kreysi
double 8 bytes. 15 lugareces decimales
Me quedé igual de loco, pensé, Hombre, quizá esto es exclusivo de C! Jajajaja
No entiendo el porqué el resultado de las sumas es incorrecto, aún cuando no ha ocurrido un desbordamiento de tipo. Ejemplo: (en el min 3:26) 1000.9999 + 1.1111 = 1002.1110 != 1002.110962
Me parece que no debería de ocurrir, pero ocurre.
Tu duda es bastante buena, por lo visto en C hay margenes de errores a la hora de operar con floats, esto no ocurre con double porque utilizan mas bytes a la hora de la representación, en este post de stackoverflow hablan de ese problema:
https://stackoverflow.com/questions/7334233/why-does-the-addition-of-two-float-numbers-is-incorrect-in-c
De verdad no era consciente que existía ese problema en C sino fuera por tu pregunta compañero.
Porque se pierde precisión en la respuesta y por ejemplo, si queremos hacer una maquina laser para operaciones oculares, la precisión en decimales es importantísima
Variables en el lenguaje C
Una variable es el nombre que le damos a un espacio en memoria para poder almacenar información de un tipo especifico y esto va a determinar el tamaño y estructura del espacio que estamos reservando en memoria.
#include<stdio.h>// Variable declarationint i, j, k;unsignedint minutes;// Variable initializationexternfloat captation =0.13;char y ='y';unsignedchar dailyWorkHours =8;intmain(){// Variable definitionint i, j, k; i =5; j =4294967295; k = i + j;printf("Sum value: %d", k);return0;}
Con el comando extern indicamos que una variable la utilizaremos en archivos externos de donde la estamos declarando. Muy útil cuando tenemos multiples archivos de C en un proyecto y una buena práctica también. Indicamos la definición de varables internas donde la vamos a utilizar como en una función por ejemplo.
Es muy importante saber que al exceder el rango de valores se desborda la memoria y el número empieza a contar desde el primer número del rango inferior de nuevo. Post sobre desbordamiento de memoria
Los placeholders o marcadores de posición son etiquetas que le indican al compilador, lo que debe imprimir en el lugar donde se encuentra la etiqueta.
Para incluir varios placeholders en una misma instrucción printf, solo es necesario ponerlos en la posición en la que se desea reemplazar la etiqueta, y luego poner las variables que serán reemplazadas en el mismo orden en el que se pusieron las etiquetas.
Existen varios placeholders que podemos usar.
Formato de escritura de variables
| Formato | Explicación |
| %u | Escribe enteros sin signo de 2 bytes (unsigned in) |
| %d %i | Escribe enteros de 2 bytes (int) |
| %ld | Escribe enteros de largo alcance (long) |
| %f | Escribe reales de 4 bytes (float) |
| %lf | Escribe reales de doble precisión de 8 bytes (double) |
| %e %E | Escribe el forma exponencial |
| %g | Despliega un valor en punto flotante %f o en la notación exponencial %e (o %E) |
| %c | Escribe un caracter de un byte (char) |
| %s | Escribe una cadena de caracteres, que terminan con \0 |
Si despues de convertir el valor a notación exponencial, el exponente del valor es menor a -4 o es mayor o igual a la precisión especificada usará %e o %E (por omisión en el caso de %g o %G, 6 dígitos significativos). De lo contrario se utilizará %f.
cuál es la diferencia entre un decimal y un flotante?
No hay diferencia en si. Solo usas float o double para declarar tus variables decimales.
float admite hasta 6 decimales.
double admite hasta 14 decimales.
Un flotante es un decimal.
¿Entonces con qué debería acompañar el % para imprimir un número digamos long double?
Al tener variables extern para estas se debe hacer una definición de las variables, indicando que se va a estar usando dentro del código.
%d es para imprimir números decimales
%f es para imprimir números flotantes
C no maneja una precisión mas allá de los seis decimales, por lo cual, si se tienen mas números después de los seis, se va a cortar, perdiendo precisión.
La declaración avanzada de variables permite declarar varias variables en una sola línea de código. Esta técnica es muy útil en situaciones donde se necesitan varias variables del mismo tipo. Por ejemplo, en lugar de declarar varias variables enteras de la siguiente manera:
int a;int b;int c;int d;
Se puede utilizar la declaración avanzada de variables para declarar todas estas variables en una sola línea de código:
int a, b, c, d;
Esta técnica no solo ahorra tiempo escribiendo código, sino que también hace que el código sea más fácil de leer y de entender.
Además, la declaración avanzada de variables también permite inicializar varias variables al mismo tiempo. Por ejemplo, si se desea inicializar cuatro variables enteras con el valor cero, se puede hacer de la siguiente manera:
int a =0, b =0, c =0, d =0;
Si se desea inicializar las variables con diferentes valores, solo es necesario separarlos con comas. Por ejemplo:
int a =1, b =2, c =3, d =4;
En resumen, la declaración avanzada de variables es una técnica muy útil en programación que permite declarar varias variables en una sola línea de código. Esta técnica no solo ahorra tiempo escribiendo código, sino que también hace que el código sea más fácil de leer y de entender. Además, permite inicializar varias variables al mismo tiempo, lo que es muy útil en situaciones donde se necesitan varias variables del mismo tipo y con los mismos valores iniciales.
Declaración avanzada de variables:)
Como vas a manejar variables cuando estes trabajando con diferentes archivos???
variable.c
#include <stdio.h>
//Variable Declaration
extern int a, b, c;
float f, g, h;
int main()
{
// Variable definition
int a, b, c;
//Variable Initialization
a =1000.99999999999; b =1.1111111111; h = g + f;
printf("Value of sum is: %d", c)
return 0;
}
El codigo no te va a decir si hay un error y es que esa es la parte rara de C, es que C no te va a decir oye todo esta mal porque declaraste estas variables y se desborda y estas perdiendo informacion.
El lenguaje C se hizo en los 70's
#include <stdio.h>//Variable Declarationsextern int a, b, c;float f, g, h;int main(){//Variable definition int a, b, c;//Variable inicialization g =1000.999999; f =1.111111; h = g + f;printf("Value of sum is: %f", h);return0;}```
No entendi el final, porque la suma es erronea? No deberia ser 1002.111111??
¿Por qué C no hace las operaciones correctamente?
d = -10000;
e = -2147483647;
f = d + e;
Debería dar como resultado: -2147493647 pero en vez de eso arroja esto: -2147493632.
Al parecer solo sucede cuando utilizo cifras grandes, por ejemplo con 5 cifras si da bien los resultados.
Quiza por el limite de los datos int explicado en la clase 8?
Creo que es por eso.
Hice las operaciones en floats, esos tienen mucho más espacio, lo que pasa es que al realizar operaciones tan grandes pierde la precisión, hay alguien más en esta clase que notó lo mismo. Será por la forma en que está hecho C. Supongo que en cursos más avanzados nos tendrán una solución.
aveces se cuelgan los videos
¡Hola! ¿Has intentado cambiando de servidor? En la parte de los controles del video hay un icono de engranaje en donde puedes cambiar de servidor. Muchas veces esto arregla esos problemas :D
gracias, muy bueno
#include<stdio.h>// Variable Declarations (Best Practices)externint a, b, c, e;float f, g, h;intmain(){// variable definitionint a, b, c, e;// Variable initialization// Max memory a =0; b =2147483647; c = a + b ;printf(" Value of sum is: %d \n", c);// Nevative memory overflow a =-10; b =-2147483647; c = a + b ;printf(" Value of sum is: %d \n", c);// Positive memory overflow e =2147483647; c = e + b;printf(" This used to be a positive number, but there was an error: %d \n", c);// Negative overflow with float g =-1000000; f =-2147483647; h = g + f ;printf(" Value of sum is: %f \n", h);// Sum with float g =1000.9999; f =1.1111; h = g + f ;printf(" Value of sum is: %f \n", h);// Presition loss g =1000.9999999999; f =1.111111111111; h = g + f ;printf(" Value of sum is: %f \n", h);return0;}
Gracias!
Muy pobre este curso
No estoy conforme
En Dev-C++ da error de compilacion con long long ("%lld") xk no soportan este tipo de formato. Para resolverlo lo cambiamos por %I64d para la funcion printf o scanf.
Resultado errado in OVERFLOW
En C, cuando una variable de tipo int excede su rango permitido, el comportamiento es no definido según el estándar del lenguaje. Sin embargo, en muchas arquitecturas —como x86— el desbordamiento se comporta como una operación de envoltura (wrap-around) usando aritmética módulo 2^{32}.
-2147483657%2^32=4294967296-2147483657=2147483639
2 ^32 = 4294967296
de ahi restando sale el resultado 2^32 - numero en overflow
4294967296-2147483657 = 2147483639
y asi sucesivamente para todos los numeros en overflow
📌Manejo de Variables en C
🔹 Variables Externas (extern)
📖 Definición: permiten compartir variables entre archivos.
✍️ Cómo usarlas:
🟦 Declaración: extern int x; → solo anuncia la variable.
🟩 Definición: int x; → crea la variable realmente.
👉 Recuerda:declarar no es lo mismo que definir.
✅ Ventajas y ⚠️ Cuidados
✨ Ventajas:
🔄 Compartir datos entre archivos.
🧹 Evitar duplicar declaraciones.
⚠️ Cuidados:
🚨 Riesgo de conflictos.
🧩 Dificultad al depurar si se usan en exceso.
⚡ Límites y Desbordamientos
📌 Los enteros (int) tienen un rango máx/min.
Si superas el rango → ocurre overflow (comportamiento inesperado).
int valor = INT_MAX;
valor += 1; // Desbordamiento
👉 Consejo: revisa siempre los rangos.
🔢 Números Decimales en C
Tipos: float y double
🎯 Clave: la precisión es limitada.
📊 Impresión: %f → muestra 6 decimales.
float g = 1.1111, f = 1000.999;
printf("%.6f", g + f); // 1002.110100
⚠️ Pérdida de precisión:
float p = 0.111111;
p += 999999.999999;
printf("%.6f", p); // Redondeado
🛠 Mejores Prácticas
✅ Verifica rangos de variables.
✅ Separa declaración y definición.
✅ Usa depuradores o herramientas externas para vigilar precisión.