C LanguageEmpezando con el lenguaje C

Observaciones

C es un lenguaje de programación de computadora imperativo, de propósito general, que admite programación estructurada, alcance de variables léxicas y recursión, mientras que un sistema de tipo estático evita muchas operaciones no intencionadas. Por diseño, C proporciona construcciones que se asignan de manera eficiente a las instrucciones típicas de la máquina y, por lo tanto, ha encontrado un uso duradero en aplicaciones que anteriormente se habían codificado en lenguaje ensamblador, incluidos los sistemas operativos, así como diversos programas de aplicación para computadoras que van desde supercomputadoras a sistemas integrados. .

A pesar de sus capacidades de bajo nivel, el lenguaje fue diseñado para fomentar la programación multiplataforma. Se puede compilar un programa C de escritura portátil y compatible con los estándares para una gran variedad de plataformas informáticas y sistemas operativos con pocos cambios en su código fuente. El lenguaje está disponible en una amplia gama de plataformas, desde microcontroladores integrados hasta supercomputadoras.

C fue desarrollado originalmente por Dennis Ritchie entre 1969 y 1973 en Bell Labs y se usó para volver a implementar los sistemas operativos Unix. Desde entonces, se ha convertido en uno de los lenguajes de programación más utilizados de todos los tiempos, con compiladores C de varios proveedores disponibles para la mayoría de las arquitecturas de computadoras y sistemas operativos existentes.

Compiladores comunes

El proceso para compilar un programa en C difiere entre compiladores y sistemas operativos. La mayoría de los sistemas operativos se envían sin compilador, por lo que tendrá que instalar uno. Algunas opciones comunes de compiladores son:

Los siguientes documentos le darán una buena descripción general de cómo comenzar a usar algunos de los compiladores más comunes:

Compilador C versión soporte

Tenga en cuenta que los compiladores tienen diferentes niveles de compatibilidad con el estándar C y muchos aún no son completamente compatibles con C99. Por ejemplo, a partir de la versión de 2015, MSVC admite gran parte de C99, pero todavía tiene algunas excepciones importantes para el soporte del lenguaje en sí (por ejemplo, el preprocesamiento parece no conforme) y para la biblioteca C (por ejemplo, <tgmath.h> ), ni ¿necesariamente documentan sus "opciones dependientes de la implementación"? Wikipedia tiene una tabla que muestra el soporte ofrecido por algunos compiladores populares.

Algunos compiladores (en particular GCC) han ofrecido, o continúan ofreciendo, extensiones de compilador que implementan características adicionales que los productores del compilador consideran necesarias, útiles o creen que pueden formar parte de una versión C futura, pero que actualmente no forman parte de ningún estándar C. Como estas extensiones son específicas del compilador, se puede considerar que no son compatibles entre sí y los desarrolladores del compilador pueden eliminarlas o alterarlas en versiones posteriores del compilador. El uso de tales extensiones generalmente puede ser controlado por banderas del compilador.

Además, muchos desarrolladores tienen compiladores que admiten solo versiones específicas de C impuestas por el entorno o la plataforma a la que se dirigen.

Si selecciona un compilador, se recomienda elegir un compilador que tenga el mejor soporte para la última versión de C permitida para el entorno de destino.

Estilo de código (fuera de tema aquí):

Debido a que el espacio en blanco es insignificante en C (es decir, no afecta el funcionamiento del código), los programadores a menudo usan espacios en blanco para que el código sea más fácil de leer y comprender, esto se denomina estilo de código . Es un conjunto de reglas y pautas que se utilizan al escribir el código fuente. Cubre inquietudes tales como cómo se deben sangrar las líneas, si se deben usar los espacios o tabulaciones, cómo se deben colocar los frenos, cómo se deben usar los espacios alrededor de los operadores y los corchetes, cómo deben nombrarse las variables, etc.

El estilo de código no está cubierto por el estándar y se basa principalmente en la opinión (diferentes personas encuentran que los diferentes estilos son más fáciles de leer), como tal, generalmente se considera fuera de tema en SO. El consejo primordial sobre el estilo en el propio código es que la consistencia es primordial: elija o haga un estilo y apéguese a él. Basta con explicar que hay varios estilos con nombre en el uso común que a menudo son elegidos por los programadores en lugar de crear su propio estilo.

Algunos estilos de sangría comunes son: estilo K & R, estilo Allman, estilo GNU, etc. Algunos de estos estilos tienen diferentes variantes. Allman, por ejemplo, se usa como Allman regular o como la variante popular, Allman-8. La información sobre algunos de los estilos populares se puede encontrar en Wikipedia . Dichos nombres de estilo se toman de los estándares que los autores u organizaciones publican a menudo para el uso de las muchas personas que contribuyen a su código, de modo que todos puedan leer fácilmente el código cuando conocen el estilo, como la guía de formato GNU que forma parte de El documento de normas de codificación GNU .

Algunas convenciones de nomenclatura comunes son: UpperCamelCase, lowerCamelCase, lower_case_with_underscore, ALL_CAPS, etc. Estos estilos se combinan de varias maneras para usar con diferentes tipos y objetos (por ejemplo, las macros a menudo usan el estilo ALL_CAPS)

El estilo K & R generalmente se recomienda para su uso dentro de la documentación de SO, mientras que los estilos más esotéricos, como Pico, no se recomiendan.

Las bibliotecas y las API no están cubiertas por el Estándar C (y, por lo tanto, están fuera de tema aquí):

Versiones

Versión Estándar Fecha de publicación
K&R n / A 1978-02-22
C89 ANSI X3.159-1989 1989-12-14
C90 ISO / IEC 9899: 1990 1990-12-20
C95 ISO / IEC 9899 / AMD1: 1995 1995-03-30
C99 ISO / IEC 9899: 1999 1999-12-16
C11 ISO / IEC 9899: 2011 2011-12-15

Hola Mundo

Para crear un programa en C simple que imprima "Hola, Mundo" en la pantalla, use un editor de texto para crear un nuevo archivo (por ejemplo, hello.c - la extensión del archivo debe ser .c ) que contenga el siguiente código fuente:

Hola C

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Demo en vivo en Coliru

Veamos este programa simple línea por línea.

#include <stdio.h>
 

Esta línea le dice al compilador que incluya el contenido del archivo de encabezado de la biblioteca estándar stdio.h en el programa. Los encabezados son generalmente archivos que contienen declaraciones de funciones, macros y tipos de datos, y debe incluir el archivo de encabezado antes de usarlos. Esta línea incluye stdio.h para que pueda llamar a la función puts() .

Ver más sobre los encabezados.

int main(void)
 

Esta línea comienza la definición de una función. Indica el nombre de la función ( main ), el tipo y el número de argumentos que espera ( void , lo que significa ninguno) y el tipo de valor que devuelve esta función ( int ). La ejecución del programa se inicia en la función main() .

{
    …
}
 

Las llaves se utilizan en pares para indicar dónde comienza y termina un bloque de código. Se pueden usar de muchas maneras, pero en este caso indican dónde comienza y termina la función.

    puts("Hello, World");
 

Esta línea llama a la función puts() para enviar el texto a la salida estándar (la pantalla, por defecto), seguida de una nueva línea. La cadena a emitir se incluye dentro de los paréntesis.

"Hello, World" es la cadena que se escribirá en la pantalla. En C, cada valor literal de cadena debe estar dentro de las comillas dobles "…" .

Ver más sobre cuerdas.

En los programas de C, cada declaración debe terminar con un punto y coma (es decir ; ).

    return 0;
 

Cuando definimos main() , lo declaramos como una función que devuelve un int , lo que significa que debe devolver un entero. En este ejemplo, estamos devolviendo el valor entero 0, que se utiliza para indicar que el programa salió correctamente. Después de la return 0; declaración, el proceso de ejecución terminará.

Editando el programa

Los editores de texto simples incluyen vim o gedit en Linux o Notepad de Notepad en Windows. Los editores multiplataforma también incluyen Visual Studio Code o Sublime Text .

El editor debe crear archivos de texto plano, no RTF u otro formato.

Compilando y ejecutando el programa.

Para ejecutar el programa, este archivo fuente ( hello.c ) primero debe compilarse en un archivo ejecutable (por ejemplo, hello en el sistema Unix / Linux o hello.exe en Windows). Esto se hace usando un compilador para el lenguaje C.

Ver más sobre compilar.

Compilar utilizando GCC

GCC (GNU Compiler Collection) es un compilador de C ampliamente utilizado. Para usarlo, abra un terminal, use la línea de comando para navegar a la ubicación del archivo fuente y luego ejecute:

gcc hello.c -o hello
 

Si no se encuentran errores en el código fuente ( hello.c ), el compilador creará un archivo binario , cuyo nombre viene dado por el argumento a la opción de línea de comando -o ( hello ). Este es el archivo ejecutable final.

También podemos usar las opciones de advertencia -Wall -Wextra -Werror , que ayudan a identificar problemas que pueden hacer que el programa falle o produzcan resultados inesperados. No son necesarios para este programa simple, pero esta es una forma de agregarlos:

gcc -Wall -Wextra -Werror -o hello hello.c
 

Usando el compilador clang

Para compilar el programa usando clang puedes usar:

clang -Wall -Wextra -Werror -o hello hello.c
 

Por diseño, las opciones de la línea de comando clang son similares a las de GCC.

Usando el compilador de Microsoft C desde la línea de comando

Si utiliza el compilador cl.exe Microsoft en un sistema Windows que admite Visual Studio y todas las variables de entorno están configuradas, este ejemplo de C se puede compilar con el siguiente comando que producirá un hello.exe ejecutable dentro del directorio en el que se ejecuta el comando (Hay opciones de advertencia como /W3 para cl , aproximadamente análogas a -Wall etc. para GCC o clang).

cl hello.c
 

Ejecutando el programa

Una vez compilado, el archivo binario puede ejecutarse escribiendo ./hello en el terminal. Una vez ejecutado, el programa compilado imprimirá Hello, World , seguido de una nueva línea, en el símbolo del sistema.

Original "¡Hola mundo!" en K&R C

El siguiente es el original "¡Hola mundo!" programa del libro The C Programming Language de Brian Kernighan y Dennis Ritchie (Ritchie fue el desarrollador original del lenguaje de programación C en Bell Labs), conocido como "K&R":

K&R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

Observe que el lenguaje de programación C no estaba estandarizado al momento de escribir la primera edición de este libro (1978), y que este programa probablemente no se compilará en la mayoría de los compiladores modernos a menos que se les indique que acepten el código C90.

Este primer ejemplo en el libro de K&R ahora se considera de baja calidad, en parte porque carece de un tipo de retorno explícito para main() y en parte porque carece de una declaración de return . La 2ª edición del libro fue escrita para el antiguo estándar C89. En C89, el tipo de main defecto sería int , pero el ejemplo de K&R no devuelve un valor definido al entorno. En C99 y estándares posteriores, se requiere el tipo de devolución, pero es seguro omitir la declaración de return de main (y solo main ), debido a un caso especial introducido con C99 5.1.2.2.3: es equivalente a devolver 0 , lo que indica éxito.

La forma recomendada y más portátil de main para sistemas alojados es int main (void) cuando el programa no usa argumentos de línea de comando, o int main(int argc, char **argv) cuando el programa sí usa los argumentos de línea de comando.


C90 §5.1.2.2.3 Terminación del programa

Un retorno de la llamada inicial a la función main es equivalente a llamar a la función de exit con el valor devuelto por la función main como su argumento. Si la función main ejecuta una devolución que no especifica ningún valor, el estado de terminación devuelto al entorno del host no está definido.

C90 §6.6.6.4 La declaración de return

Si se ejecuta una declaración de return sin una expresión, y el llamante utiliza el valor de la llamada a la función, el comportamiento no está definido. Llegar al } que termina una función es equivalente a ejecutar una declaración de return sin una expresión.

C99 §5.1.2.2.3 Terminación del programa

Si el tipo de retorno de la función main es un tipo compatible con int , un retorno de la llamada inicial a la función main es equivalente a llamar a la función de exit con el valor devuelto por la función main como su argumento; alcanzar el } que termina la función main devuelve un valor de 0. Si el tipo de retorno no es compatible con int , el estado de terminación devuelto al entorno de host no está especificado.