% ENV=var ./a.out 0<STDIN 1>STDOUT 2>STDERR
Andrés Hernández - tonejito
Agosto 2023
Debian, Ubuntu, Mint, …
Red Hat, CentOS, Rocky, Alma, Oracle, …
Extraer código fuente
Cambiar al directorio amhello-0.1
Ejecutar make
$ make
######## hello ########
gcc -g -O2 -o hello hello.c
file hello
hello: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=ab18e89297796f8c0e47e5cff913d94106070243, for GNU/Linux 3.7.0, with debug_info, not strippedC#include <stdio.h>
int main(void)
{
printf("%s", "Hello world!");
return 0;
}
int main(void)int main(int argc, char* argv[])int main(int argc, char* argv[], char* envp[])0xhh \xhh Se permite cualquier numero de dígitos hexadecimales0ooo \ooo Se permiten hasta tres dígitos o tales| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
| Función, arreglo, miembro de estructura, puntero a miembro de estructura | () [] . -> |
I ⇒ D |
| Operadores unarios | - ++ -- ! ~ * & sizeof (tipo) |
D ⇒ I |
| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
| Multiplicación, división y resto aritméticos | * / % |
I ⇒ D |
| Suma y resta aritméticas | + - |
I ⇒ D |
| Operadores de desplazamiento a nivel de bits | << >> |
I ⇒ D |
| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
| Operadores relacionales | < <= > >= |
I ⇒ D |
| Operadores de igualdad | == != |
I ⇒ D |
AND a nivel de bits |
& |
I ⇒ D |
| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
XOR a nivel de bits |
^ |
I ⇒ D |
OR a nivel de bits |
| |
I ⇒ D |
AND lógica |
&& |
I ⇒ D |
| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
OR lógica |
|| |
I ⇒ D |
| Operador condicional | ? : |
D ⇒ I |
| Grupo de precedencia | Operadores | Asociatividad |
|---|---|---|
| Operadores de asignación | = += -= *= /= %= &= ^= |= <<= >>= |
D ⇒ I |
| Operador coma | , |
I ⇒ D |
| Tipo de dato | Descripción | Detalles | Requisitos típicos de memoria |
|---|---|---|---|
int |
Número entero | Estándar | 2 bytes (1 word) |
short |
Número entero “corto” | Menos dígitos que int |
2 bytes (1 word) |
long |
Número entero “largo” | Más dígitos que int |
4 a 8 bytes (1 a 2 words) |
unsigned † |
Número sin signo (no negativo) |
Doble valor máximo de int |
2 bytes (1 word) |
† La palabra unsigned puede aparecer como modificador a short:
unsigned short intunsigned shorty también como modificador a long:
unsigned long intunsigned long| Tipo de dato | Descripción | Detalles | Requisitos típicos de memoria |
|---|---|---|---|
char |
Caracter | Estándar | 1 byte |
signed char |
Caracter | Rango -128 a +127 | 1 byte |
unsigned char |
Caracter | Rango 0 a 255 | 1 byte |
| Tipo de dato | Descripción | Detalles | Requisitos típicos de memoria |
|---|---|---|---|
float |
Número de punto flotante | Contiene punto decimal y exponente | 2 bytes (1 word) |
double |
Número de punto flotante de doble precisión | Más cifras significativas, exponente mayor | 8 bytes (2 words) |
long double |
Número de punto flotante de precisión extendida | Mayor rango de valores que double |
2 o más bytes (1 o más words) |
| Tipo de dato | Descripción | Detalles | Requisitos típicos de memoria |
|---|---|---|---|
void |
Tipo de dato para funciones que no devuelven ningún valor | No aplica | |
enum |
Constante de enumeración | Tipo especial int |
2 bytes (1 word) |
Estas reglas aplican a operaciones aritméticas entre dos operadores con distintos tipos de datos. Puede existir alguna variación de una versión de C a otra.
| Operando | Operando convertido | Resultado |
|---|---|---|
long double |
long double |
long double |
double |
double |
double |
float |
float |
float |
unsigned long int |
unsigned long int |
unsigned long int |
| Operando 1 | Operando 2 | Notas |
|---|---|---|
long int |
unsigned int |
Ver notas |
unsigned int se puede convertir a long int, entonces el resultado es long int.unsigned long int y el resultado será unsigned long int| Operando | Operando convertido | Resultado |
|---|---|---|
long int |
long int |
long int |
unsigned int |
unsigned int |
unsigned int |
Si no se puede aplicar ninguna de las conversiones anteriores, entonces ambos operandos serán convertidos a int (si es necesario) y el resultado será de tipo int.
Nota: Algunas versiones de C convierten automáticamente todos los operandos float a double antes de hacer operaciones
Si los dos operandos en una expresión de asignación son de tipos distintos, entonces el valor del operando de la derecha será automáticamente convertido al tipo del operando de la izquierda.
La expresión de asignación completa será de este mismo tipo. Además:
Instrucción
break
Ejemplo
for (n=1;n<=100;n++)
{
scanf("%f", &x);
if (x<0)
{
printf("ERROR - Negativo");
break;
}
}
Instrucción
continue
Ejemplo
for (n=1;n<=100;n++)
{
scanf("%f", &x);
if (x<0)
{
printf("ADVERTENCIA - Negativo");
continue;
}
}
Instrucción
do-while
Ejemplo
do
{
printf("%d\n", digito++);
}
while (digito <= 9)
Instrucción
while
Ejemplo
while (digito <= 9)
{
printf("%d\n", digito++);
}
Instrucción
for
Ejemplo
for (digito=0; digito<=9; digito++)
{
printf("%d\n", digito);
}
Instrucción
goto
Ejemplo
if (x<0)
goto etiqueta;
... ... ...
etiqueta: printf("ERROR");
Instrucción
if
Ejemplo
if (x<0)
printf("Negativo");
Instrucción
if-else
Ejemplo
if (x<0)
printf("Negativo");
else
printf("Positivo");
Instrucción
if-anidado
Ejemplo
if (x<0)
printf("Negativo");
else
if (x>0)
printf("Positivo");
else
printf("Cero");
Instrucción
return
Ejemplo
int suma(int a, int b)
{
return (a + b);
}
Instrucción
switch
Ejemplo
eleccion = getchar()
switch (eleccion) {
case 'R':
printf("Rojo");
break;
case 'G':
printf("Verde");
break;
case 'B':
printf("Azul");
break;
default:
printf("ERROR");
}
*char , char[]\0, NULL, EOF*char[] , **charstrcpy(), strncpy()scanf| Caracter | Descripción |
|---|---|
c |
Caracter (char) |
d |
Entero decimal (int) |
e |
Decimal de punto flotante (float) |
f |
Decimal de punto flotante (float) |
g |
Decimal de punto flotante (float) |
h |
Entero “corto” (short int) |
i |
Entero decimal, hexadecimal u octal |
o |
Entero octal |
| Caracter | Descripción |
|---|---|
s |
Cadena de caracteres seguido de un espacio en blanco † |
u |
Entero decimal sin signo (unsigned int) |
x |
Entero hexadecimal |
[. . .] |
Cadena de caracteres que puede contener espacios en blanco |
† El terminador de cadena \0 se añade automáticamente
Un prefijo puede anteceder a ciertos caracteres de conversión
| Prefijo | Descripción |
|---|---|
h |
Entero “corto” con o sin signo (short int o unsigned short) |
l |
Número “largo” (long, unsigned long, double) |
L |
Número “largo” (long double) |
printf‡ Algunos de estos caracteres se interpretan de modo diferente que en scanf
| Caracter | Descripción |
|---|---|
c |
El dato se imprime como caracter (char) |
d |
El dato se imprime como entero (int) |
e |
El dato see imprime como valor flotante CON exponente (float) (notación científica) |
f |
El dato see imprime como valor flotante SIN exponente (float) |
| Caracter | Descripción |
|---|---|
g |
El dato see imprime de acuerdo a la conversión † |
† El dato se muestra como un valor en coma flotante usando la conversión de tipo e o f, dependiendo del valor; no se muestran ceros no significativos ni el punto decimal si no es significativo
| Caracter | Descripción |
|---|---|
i |
El dato see imprime como entero con signo (int) |
o |
El dato see imprime como octal sin el cero inicial |
s |
El dato see imprime como cadena de caracteres |
u |
El dato see imprime como entero sin signo (unsigned int) |
x |
El dato see imprime como hexadecimal sin el prefijo 0x |
Un prefijo puede anteceder a ciertos caracteres de conversión
| Prefijo | Descripción |
|---|---|
h |
Entero “corto” con o sin signo (short int o unsigned short) |
l |
Número “largo” (long, unsigned long, double) |
L |
Número “largo” (long double) |
La función printf acepta algunos modificadores
| Modificador | Descripción |
|---|---|
- |
El dato es justificado a la izquierda dentro del campo Los espacios se agregan al final. |
+ |
El prefijo de signo + o - se agregará a cada número Sin este modificador únicamente los números negativos tendrán el signo. |
| Modificador | Descripción |
|---|---|
0 |
Añade ceros en lugar de espacios en blanco Aplica a datos justificados a la derecha y en campos cuya longitud es mayor que el dato † |
† Nota: algunos compiladores consideran el indicador cero como una parte de la especificación de la longitud de campo en vez de como un indicador real. Esto segura que el O se procese el último si están presentes múltiples indicadores.
| Modificador | Descripción |
|---|---|
Espacio en blanco |
Un espacio en blanco precede a los datos positivos Este indicade es anulado por + si ambos están presentes |
| Modificador | Descripción |
|---|---|
# |
Con conversiones o- y x- Hace que los datos octales sean precedidos por 0 y los hexadecimales sean precedidos por 0x |
# |
Con cnoversiones e-, f- y g- Hace que esté presente el punto decimal en todos los números de punto flotante, incluso si el número no tiene decimales. Trunca los ceros no significativos con la conversión g-. |