A continuación se muestra el programa más sencillo posible en C:
int main( )
{
}
Todo programa en C debe tener y sólo una función main(). Esta función debe constar de una serie de sentencias (en este caso vacía) delimitada por los símbolos { }. Estas sentencias especifican la secuencia de acciones que el programa llevará a cabo.
En C pueden ponerse comentarios en cualquier sitio del programa, utilizando los símbolos /* */. El compilador de C ignora todo el texto entre el inicio del comentario (/*) y el final del mismo (*/). Añadir comentarios a un programa no incrementa el tamaño de los archivos objeto ni ejecutable, ni tampoco ralentiza la ejecución del programa. En el caso de comentarios de una línea pueden ir precedidos por //
Ejemplo 1:
/* Mi programa
en C */
int main ( )
{
// otro comentario
}
El modelo de compilación en C
Preprocesador
El preprocesador toma como entrada el código fuente y es el responsable de eliminar los comentarios (ya que no representan ninguna instrucción) y de interpretar las directivas especiales del preprocesador, denotadas por el símbolo #. Por el momento destacaremos únicamente dos de las directivas más utilizadas:
- include: incluye un archivo externo dentro del archivo fuente. Se utilizan los símbolos < > para indicar que el archivo se encuentra en un directorio del entorno de compilación, distinto del directorio de trabajo actual. Por el contrario, se utilizan los símbolos “ “ para indicar archivos locales. Por ejemplo:
- #include <stdio.h> -> incluye el archivo con las definiciones de las funciones de entrada y salida de la librería estándar
- #include “funciones.h” -> incluye el archivo funciones.h del directorio actual
- #define : define un nombre simbólico. Cuando el preprocesador encuentra un nombre simbólico en el programa le sustituye por el valor que se le haya asociado con la directiva #define. Por ejemplo:
- #define NUM_ELEMENTS 100 -> Define la constante NUM_ELEMENTS con el valor 100
- #define PI 3.1415927 -> Define la constante PI.
En pseudocódigo utilizaremos la declaración:
const <nombre_constante_1> = <valor_1>;
<nombre_constante_2> = <valor_2>;
...
fconst
Elementos sintácticos de un programa en C
Símbolo | Significado |
# | Indicador de directivas de precompilación (#define, #include, ...) |
/* ...... */ | Delimitadores de los comentarios. Son ignorados por el compilador |
; | Final de sentencia. Todas las sentencias deben terminar en ; |
{.....} | Delimitadores de un bloque de instrucciones que forman una unidad |
Identificadores
Un identificador en un lenguaje de programación es un nombre utilizado para referir un valor constante, una variable, una estructura de datos compleja, o una función, dentro de un programa. Todo identificador está formado por una secuencia de letras, números y caracteres de subrayado, con la restricción de que no puede empezar por un número y no puede tener caracteres en blanco.
El lenguaje C diferencia entre mayúsculas y minúsculas.
En cualquier caso, nunca pueden utilizarse las palabras reservadas del lenguaje.
Palabras reservadas
Auto | do | goto | signed | Unsigned |
break | double | if | sizeof | void |
Case | else | int | static | volatile |
Char | enum | long | struct | while |
const | extern | register | switch | |
continue | float | return | typedef | |
default | for | short | union |
Estructura de un programa
Todo programa en C consta básicamente de los siguientes elementos:
- Directivas del preprocesador
- Definiciones de tipos de datos
- Declaraciones de funciones
Por el momento trataremos únicamente la declaración de la función main() que corresponde al programa principal. La ejecución de un programa escrito en C siempre comienza por esta función. Por esta razón, en un programa sólo puede haber una función con ese nombre.
Toda función en C y en particular la función main ( ), tiene la siguiente estructura:
Tipo_de_datos_que_devuelve nombre_función ( parámetros_de_la_función)
{
declaración_de_variables;
secuencia_de_sentencias;
}
Dejamos para más adelante el paso de parámetros y la devolución de datos de un determinado tipo. Simplemente hay que ver que tanto la devolución de datos como los parámetros son opcionales, y que en la mayoría de casos no lo necesitamos en el programa principal.
A continuación vemos un ejemplo de un programa para evaluar la expresión 3*5-32/4:
#include <stdio.h>
int main ( )
{
int a,b,c = 5;
a = 3 * c;
b=32/4;
c= a – b;
printf (“El valor de la expresión es: %d\n”, c);
}
El cuerpo del programa principal lo constituyen todas las líneas comprendidas entre los símbolos {}. En cada una de las líneas puede haber una o más sentencias. Una sentencia es una orden completa para el ordenador. Toda sentencia debe acabar con punto y coma.
Tipo de datos elementales
En C hay tres tipos de datos elementales, a partir de los cuales se construyen todos los demás, el tipo char (carácter), el tipo int (entero) y sus variantes, y el tipo float (real) y variantes.
Datos de tipo entero (entero/int)
TIPOS | RANGO | BYTES |
short short int |
-32768 A 32767. | 2 |
int signed int |
-2,147,483,648 A 2,147,483,647 | 4 |
unsigned int | 0 A 4294967295 | 4 |
long int long signed long int |
-2.147.483.648 A 2.147.483.647 | 4 |
Dades de tipus real (Real /float i double)
TIPOS | RANGO | BYTES |
float | 3.4X10-38 A 3.4X1038 | 4 |
double | 1.7X10-308 A 1.7X10308 | 8 |
long double | 3.4X10-4932 A 3.4X104932 | 10 |
Datos de tipo carácter (Carácter / char)
TIPOS | RANGO | BYTES |
char unsigned char |
-128 A 127 | 1 |
unsigned char | 0 A 255 | 1 |
Datos de tipo lógico (Booleano / -)
El lenguaje C a diferencia de la mayoría de lenguajes de programación, no dispone inicialmente del tipos de datos booleano para representar los valores verdadero (true) o falso (false). A C se considera true cualquier valor numérico distinto de 0 y false el valor 0. El tipo de datos lógico o booleano se acostumbra a representar mediante una variable de tipo int. En cuanto a los valores true y false se suelen definir con macros de la siguiente manera:
- #define TRUE 1
- #define FALSE 0
Operadores
Operadores de asignación
Permite asignar valores a las variables. Su símbolo es un signo igual ( = ). Este operador asigna en la variable que está a la izquierda del operador el valor que está a la derecha.
Su forma general es:
nombre_variable = expresión;
En la expresión de la derecha puede aparecer la misma variable a la que se desea asignar la expresión. Una sentencia tal como:
- a = a+1;
es totalmente correcta en C, aunque matemáticamente parezca incorrecta.
Además del operador de asignación (=) existen otros cuatro operadores de asignación: (+=, –=, *= i /=)
- a += b significa a = a + b
- a –= b significa a = a – b
- a *= b significa a = a * b
- a /= b significa a = a / b
Operadores con datos de tipo entero
OPERACION | PSEUDOCODIGO | C |
Suma | + | + |
Resta | - | - |
Multiplicación | * | * |
División | DIV | / |
Módulo | MOD | % |
Operadores con datos de tipo real
OPERACION | PSEUDOCODIGO | C |
Suma | + | + |
Resta | - | - |
Multiplicación | * | * |
División | / | / |
Operadores con datos de tipo lógico
A | B | NO A (!A) | A y B (A && B) | A o B (A || B) |
VERDADERO | VERDADERO | FALSO | VERDADERO | VERDADERO |
VERDADERO | FALSO | FALSO | FALSO | VERDADERO |
FALSO | VERDADERO | VERDADERO | FALSO | VERDADERO |
FALSO | FALSO | VERDADERO | FALSO | FALSO |
Operadores relacionales
Se pueden utilizar con cualquier tipo de datos. El resultado es siempre un dato de tipo lógico.
OPERACION | PSEUDOCODIGO | C |
Mayor | > | > |
Mayor o igual | ≥ | >= |
Menor | < | < |
Menor o igual | ≤ | <= |
Igual | = | = |
No igual | ≠ | != |
Prioridad de los operadores aritméticos
La prioridad de las operaciones es simplemente el orden en que éstas se ejecutan.
Por ejemplo consideramos la expresión : x := 5+4/ 2
La prioridad exige que la división se ejecute antes que la suma. Sino la operación anterior podría considerarse de dos formas. Si la división se hace antes el resultado será 7, si la suma se hiciera antes el resultado sería 4.5. Si realmente nosotros quisiéramos que la suma se hiciera antes deberíamos indicarlo utilizando paréntesis -> x = (5+4)/2
Prioridad | Operador | Orden de cálculo |
1 | () | Se calculan primero. Si hay paréntesis anidados, la expresión en el par más interno se evalúa primero. Si existe más de uno par “en el mismo nivel”, se calculan de izquierda a derecha. |
2 | *, /, % | Se evalúan en segundo lugar. Si hay más de una, se calculan de izquierda a derecha. |
3 | +, - | Se evalúan en último lugar. Si hay más de una, se calculan de izquierda a derecha. |