# ISO 9899

El estándar internacional ISO 9899, fue creado por ISO (Organización Internacional de Normalización) con el objetivo de promover la portabilidad de los programas en C en varios sistemas de procesamiento de datos. Está direccionado a la utilización de los ejecutores y los programadores.

## Alcance

Este estándar determina la forma en la cual se interpreta los programas en el lenguaje de programación C en los siguientes apartados:
* La representación de programas escritos en C.
* La sintaxis y restricciones de C.
* Las reglas semánticas para interpretar programas en C.
* La representación de los datos de salida resultantes de programas de C.
* Las restricciones y limitaciones impuestas de acuerdo a la implementación de C.
Este estándar Internacional no determina:
* El mecanismo mediante los programas de C son transformados por un sistema de procesamiento de datos.
* El mecanismo mediante los programas de C son invocados por un sistema de procesamiento de datos.
* El mecanismo por el cual los datos son transformados para su uso en programas de C.
* El mecanismo por el cual los datos son transformados tras haber sido producidos por un programa de C.
* El tamaño o la complejidad de un programa y sus datos que excederán la capacidad de cualquier sistema de procesamiento de datos específico o la capacidad de un procesador particular.
* Todos los requisitos mínimos de un sistema de procesamiento de datos que sea capaz de soportar implementación conforme.

## Referencias Normativas

Los siguientes documentos normativos contienen disposiciones que, mediante su referencia en este texto, constituyen disposiciones de esta Norma Internacional. Para referencias fechadas, enmiendas subsecuentes o revisiones de cualquiera de estas publicaciones no se aplican. Sin embargo, se alienta a las partes de los acuerdos basados en esta Norma Internacional a investigar la posibilidad de aplicar las ediciones más recientes de los documentos normativos que se indican a continuación. Para referencias sin fecha, se aplica la última edición del documento normativo mencionado. Los miembros de ISO e IEC mantienen registros de las normas internacionales actualmente vigentes.
* ISO 31-11: 1992, Cantidades y unidades - Parte 11: Signos y símbolos matemáticos para uso en ciencias físicas y tecnología.
* ISO / IEC 646, Tecnología de la información - Conjunto de caracteres codificados en ISO de 7 bits para el intercambio de información .
* ISO / CEI 2382−1: 1993, Tecnología de la información - Vocabulario - Parte 1: Términos fundamentales.
* ISO 4217, Códigos para la representación de monedas y fondos.
* ISO 8601, Elementos de datos y formatos de intercambio - Intercambio de información - Representación de fechas y horas.
* ISO / IEC 10646 (todas las partes), Tecnología de la información - Juego de caracteres universal codificado con múltiples octetos (UCS).
* IEC 60559: 1989, aritmética binaria de punto flotante para sistemas de microprocesador (anteriormente designada en IEC 559: 1989).

## Términos, definiciones y símbolos

| Término | Definición |
| Acceso | Acción en tiempo de ejecución para leer o modificar el valor de un objeto. |
| Alineamiento | Requisito de que los objetos de un tipo particular se ubiquen en los límites de almacenamiento con direcciones que son múltiplos particulares de una dirección de byte. |
| Argumento | Expresión en la lista separada por comas delimitada por los paréntesis en una expresión de llamada de función, o una secuencia de tokens de preprocesamiento en la lista separada por comas delimitada por los paréntesis en una macro invocación de función. |
| Comportamiento | Apariencia o acción externa. |
| Comportamiento definido por la implementación | Comportamiento no especificado donde cada implementación documenta cómo se escoge la opción. |
| Comportamiento de especificación local | comportamiento que depende de las convenciones locales de nacionalidad, cultura e idioma que cada implementación documenta. |
| Comportamiento indefinido | Comportamiento, al usar una construcción de programa no portable o errónea o de datos erróneos, para los cuales este Estándar Internacional no impone requisitos. |
| Bit | Unidad de almacenamiento de datos en el entorno de ejecución lo suficientemente grande como para contener un objeto que tendrá un valor, de dos posibles. |
| Byte | Unidad de almacenamiento de datos direccionable lo suficientemente grande como para contener a cualquier miembro del juego de caracteres básico del entorno de ejecución. |
| Carácter | Miembro abstracto de un conjunto de elementos utilizados para la organización, control o representación de datos. |
| Carácter multibyte | Secuencia de uno o más bytes que representan un miembro del conjunto de caracteres extendido del entorno de origen o de ejecución. |
| Carácter amplio | Representación de bits que encaja en un objeto de tipo wchar_t, capaz de representar cualquier carácter en el entorno local actual. |
| Constante | Restricción, ya sea sintáctica o semántica, por la cual se debe interpretar la exposición de elementos del lenguaje. |
| Resultado correctamente redondeado | Representación en el formato del resultado que tiene el valor más cercano, sujeto al modo de redondeo efectivo, a lo que se le daría al resultado un rango y precisión ilimitados. |
| Mensaje de diagnóstico | Mensaje perteneciente a un subconjunto de implementación definido de la salida del mensaje de la implementación. |
| Referencia directa | Referencia a una subcláusula posterior de este Estándar Internacional que contiene información adicional relevante a esta subcláusula. |
| Implementación | Conjunto particular de software, que se ejecuta en un entorno de traducción particular bajo opciones de control particulares, que realiza la traducción de programas y admite la ejecución de funciones en un entorno de ejecución particular. |
| Límite de implementación | Restricción impuesta a los programas por la implementación. |
| Objeto | Región de almacenamiento de datos en el entorno de ejecución, cuyo contenido puede representar valores. |
| Parámetro | Objeto declarado como parte de una declaración o definición de función que adquiere un valor en la entrada a la función, o un identificador de la lista separada por comas delimitada por paréntesis inmediatamente después del nombre de la macro en una definición de macro similar a una función. |
| Práctica recomendada | Especificación que se recomienda encarecidamente para cumplir con la intención del estándar, pero que puede ser poco práctico para algunas implementaciones. |
| Valor | Significado preciso del contenido de un objeto cuando se interpreta que tiene un tipo específico. |
| Valor definido por la implementación | Valor no especificado donde cada implementación documenta cómo es la elección. |
| Valor indeterminado | Valor no especificado o una representación trampa. |
| Valor no especificado | Valor válido del tipo relevante donde este Estándar Internacional no impone requisitos sobre qué valor se elige en ningún caso. |

## Conformidad

En esta Norma Internacional, "debe" se tiene que interpretar como un requisito en una implementación o en un programa; por el contrario, "no debe" tiene que interpretarse como una prohibición.
* Si se viola un requisito de "debe" o "no debe" que aparece fuera de una restricción, el comportamiento es indefinido. El comportamiento indefinido se indica de otra manera en esta Norma Internacional por las palabras "comportamiento indefinido" o por la omisión de cualquier definición explícita de comportamiento. No hay diferencia de énfasis entre estos tres; todos describen un "comportamiento indefinido".
* Un programa que sea correcto en todos los demás aspectos, que opere con datos correctos, que contenga un comportamiento no especificado, será un programa correcto.
* La implementación no debe traducir con éxito una unidad de traducción de preprocesamiento que contenga una directiva de preprocesamiento #error a menos que sea parte de un grupo omitido por inclusión condicional.
* Un programa estrictamente conforme debe utilizar solo aquellas características del lenguaje y la biblioteca especificadas en esta Norma Internacional. Un programa estrictamente conforme puede usar características condicionales siempre que el uso esté protegido por una directiva #ifdef con la macro apropiada. No debe producir resultados dependientes de ningún comportamiento no especificado, indefinido o definido por la implementación, y no deberá exceder ningún límite mínimo de implementación.
* Las dos formas de implementación conforme son alojadas e independientes. Una implementación hospedada conforme deberá aceptar cualquier programa estrictamente conforme. Una implementación independiente conforme deberá aceptar cualquier programa estrictamente conforme que no use tipos complejos y en el que el uso de las características especificadas en la cláusula de la biblioteca se delimite al contenido de los encabezados estándar <float.h>, <iso646.h>, <límites.h>, <stdarg.h>, <stdbool.h>, <stddef.h> y <stdint.h>. Una implementación conforme puede tener extensiones (incluidas funciones de biblioteca adicionales), siempre que no alteren el comportamiento de ningún programa estrictamente conforme. Esto implica que una implementación conforme no reserva identificadores distintos a los reservados explícitamente en esta Norma Internacional.
* Un programa conforme es uno que es aceptable para una implementación conforme. Los programas estrictamente conformes están destinados a ser máximamente portátiles entre las implementaciones conformes. Los programas conformes pueden depender de características no portables de una implementación conforme.
* Una implementación debe ir acompañada de un documento que defina todas las características definidas y específicas de la implementación y todas las extensiones.

## Entorno

Una implementación traduce los archivos fuente C y ejecuta programas en C en dos entornos del sistema de procesamiento de datos, que se denominarán entorno de traducción y ejecución en este estándar internacional.
Sus características definen y restringen los resultados de ejecutar programas escritos en C de acuerdo con las reglas sintácticas y semánticas para implementaciones.

### Modelos conceptuales
#### Entorno de traducción
###### Estructura del programa

No es necesario que todos los programas C se traduzcan al mismo tiempo. Se guarda el texto del programa en unidades llamadas archivos de origen o archivos de preprocesamiento.
Se conoce como unidad de traducción de preprocesamiento al archivo fuente que contiene los encabezados y los archivos fuentes incluidos mediante la directiva de preprocesamiento #include.
La unidad de traducción de preprocesamiento se denomina unidad de traducción.
Las unidades de traducción que han sido traducidas previamente se pueden conservar de forma individual o en bibliotecas.
Las unidades de traducción separadas de un programa se comunican entre sí mediante las llamadas a funciones cuyos identificadores tienen enlace externo, manipulación de objetos cuyo identificadores tienen enlaces enlaces externos o archivos de datos.
Las unidades de traducción se pueden traducir por separado y luego vincularse para dar lugar a un programa ejecutable.

###### Fases de traducción

1. Los caracteres multibyte del archivo de origen físico se asignan al conjunto de caracteres de origen si es necesario.
2. Cada instancia de un carácter de barra diagonal inversa (\) seguido inmediatamente por una nueva línea de carácter se elimina, uniendo las líneas de origen físico para formar líneas de origen lógico.
3. El archivo fuente se descompone en tokens de preprocesamiento y secuencias de caracteres de espacio en blanco. Un archivo fuente no debe terminar en un token de preprocesamiento parcial o en un comentario parcial. Cada comentario será reemplazado por un carácter espacial.
4. Las directivas de preprocesamiento se ejecutan, las macroinvocaciones se expanden y las expresiones del operador _Pragma se ejecutan. Si coincide una secuencia de caracteres con la sintaxis de un nombre de carácter universal producido por un token de concatenación, el comportamiento es indefinido.
Una directiva de procesamiento de #include hace que el encabezado o el archivo fuente se procesen desde la fase 1 mediante la 4 recursivamente, las directivas de preprocesamiento se eliminan.
5. Cada miembro del conjunto de caracteres de origen y secuencia de escape en constantes de caracteres y las cadenas se convierten en el miembro del conjunto de caracteres de ejecución correspondiente. Si no hay un miembro correspondiente, se convierte en uno definido por la implementación que no sea nulo.
6. Los tokens literales de cadena adyacentes se concatenan.
7. Los caracteres de espacios en blanco que separan los tokens ya no son significativos. Todo token de preprocesamiento es un token, y estos token resultantes son analizados sintácticamente y semánticamente y traducido como unidad de traducción.
8. Se resuelven todas las referencias externas de objetos y funciones. Los componentes de la biblioteca son vinculados para satisfacer las referencias externas a funciones y objetos no definidos en la traducción actual. Todos los resultados de la traducción se recopilan en una imagen del programa que contiene la información necesaria para la ejecución en su entorno de ejecución.

###### Diagnósticos

Cada implementación producirá al menos un mensaje de diagnóstico, si una unidad de traducción o de traducción de preprocesamiento contiene una violación de cualquier regla o restricción de sintaxis o incluso de comportamiento será especificado como indefinido o como implementación definida. Los mensajes de diagnóstico no necesitan ser producidas en ninguna otra circunstancia.

#### Entorno de ejecución

Hay dos tipos: Independientes y Alojados. En ambos casos, se da el inicio del programa cuando la ejecución llama a una función C designada al entorno de ejecución. Todo objeto con almacenamiento estático se inicializará antes del inicio del programa. La terminación del programa devuelve el control al entorno de ejecución.

##### Entorno Independiente

El nombre y tipo de función llamada en el inicio del programa son definidas por la implementación. Cualquier biblioteca disponible para un programa independiente son definidas por la implementación, al igual que los efectos de la finalización del programa en un entorno independiente.

##### Entorno Alojado

No es necesario pero tienen que cumplir con lo siguiente:

###### Inicio del programa en Entorno Alojado

La función llamada al inicio del programa se llama main, se declara con un tipo int y sin parámetros o con dos parámetros (argc y argv).

###### Ejecución del programa en Entorno Alojado

Un programa puede usar todas las macros, funciones,definiciones de tipo y objetos descritos en la cláusula de la biblioteca.

###### Terminación del programa en Entorno Alojado

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 salida con el valor devuelto por la función main como argumento, devuelve 0. Si no es compatible el estado de terminación devuelto al entorno no está especificado.

###### Ejecución del Programa

* Las descripciones semánticas en esta Norma Internacional describen el comportamiento de una máquina abstracta en la que los problemas de optimización son irrelevantes.
* Acceder a un objeto volátil, modificar un objeto, modificar un archivo o llamar a una función que realice cualquiera de esas operaciones son todos efectos secundarios, que son cambios en el estado del entorno de ejecución. La evaluación de una expresión puede producir efectos secundarios. En ciertos puntos especificados en la secuencia de ejecución llamados puntos de secuencia, todos los efectos secundarios de las evaluaciones anteriores deberán estar completos y no se habrá producido ningún efecto secundario de las evaluaciones posteriores.
* En la máquina abstracta, todas las expresiones se evalúan según lo especificado por la semántica. Una implementación real no necesita evaluar parte de una expresión si puede deducir que su valor no se usa y que no se producen los efectos secundarios necesarios (incluidos los causados por llamar a una función o acceder a un objeto volátil).
* Cuando el procesamiento de la máquina abstracta se interrumpe al recibir una señal, solo se puede confiar en los valores de los objetos a partir del punto de secuencia anterior. Los objetos que pueden modificarse entre el punto de secuencia anterior y el siguiente punto de secuencia aún han podido no recibir sus valores correctos.
* Los requisitos mínimos en una implementación conforme son:
** En los puntos de secuencia, los objetos volátiles son estables en el sentido de que los accesos anteriores están completos y los accesos posteriores aún no se han producido.
** Al finalizar el programa, todos los datos escritos en los archivos serán idénticos al resultado que habría producido la ejecución del programa de acuerdo con la semántica abstracta.
** La intención de estos requisitos es que la salida sin búfer o con búfer de línea aparezca lo antes posible, para garantizar que los mensajes de solicitud realmente aparezcan antes de que un programa espere entrada.
* Lo que constituye un dispositivo interactivo está definido por la implementación.
* Cada implementación puede definir correspondencias más estrictas entre la semántica abstracta y la real.

### Consideraciones
#### Conjunto de caracteres

Se definirán dos conjuntos de caracteres y sus secuencias de clasificación asociadas, cada conjunto se divide además en un conjunto de caracteres básicos, cuyo contenido viene dado por esta subcláusula, y un conjunto de cero o más caracteres específicos de la localidad (que no son miembros del conjunto de caracteres básico) llamados caracteres extendidos El conjunto combinado también se denomina conjunto de caracteres extendido. Los valores de los miembros del juego de caracteres de ejecución están definidos por la implementación En una constante de caracteres o cadena, los miembros del conjunto de caracteres de ejecución serán representado por los miembros correspondientes del conjunto de caracteres de origen o por un escape secuencias que consisten en la barra invertida seguida de uno o más caracteres. Un byte con todos los bits establecidos en 0, llamados caracteres nulos, existirán en el conjunto de caracteres de ejecución básica; eso se usa para terminar una cadena de caracteres.

#### Semántica de visualización de caracteres

La posición activa es esa localización en un dispositivo de visualización donde aparecerá el carácter de salida colocado por la función fputc.
El hecho de imprimir un carácter en un dispositivo de visualización es mostrar una representación gráfica de dicho carácter en la posición activa y luego avanzar a la siguiente posición de la línea.
Si la posición activa se encuentra al final, el comportamiento del dispositivo no se especifica.
Las secuencias de escape alfabéticas que representan caracteres no gráficos en el conjunto de caracteres de ejecución están destinadas a producir acciones en dispositivos de visualización de la siguiente manera:
Secuencias de escape alfabéticas :
| Secuencias | Utilidad |
| \a (alert) | Produce una alerta audible o visible sin cambios de posición. |
| \b (backspace) | Mueve la posición activa a la posición anterior en la línea actual. Si la posición activa está en la posición inicial, el comportamiento no está especificado. |
| \f (form feed) | Mueve la posición activa a la posición inicial al comienzo de la siguiente página lógica. |
| \n (new line) | Mueve la posición activa a la posición inicial de la siguiente línea. |
| \r (carriage return) | Mueve la posición activa a la posición inicial de la línea actual. |
| \t (horizontal tab) | Mueve la posición activa a la siguiente posición de tabulación horizontal en la línea actual. Si la posición activa está en o más allá de la última posición de tabulación horizontal definida, el comportamiento del dispositivo no se especifica. |
| \v (vertical tab) | Mueve la posición activa a la posición inicial de la siguiente posición de tabulación vertical. Si la posición activa está en, o más allá de la última posición de tabulación vertical definida, el comportamiento del dispositivo no se especifica. |
Cada una de estas secuencias de escape producirá un valor único definido por la implementación que se puede almacenar en un único objeto char. Las representaciones externas en un archivo de texto no es necesario que sean idénticas a las representaciones internas, y están fuera del alcance de esta Norma Internacional.

#### Señales e interrupciones

Las funciones deben ser implementadas de tal manera que puedan ser interrumpidas en cualquier momento por una señal, o pueden ser llamadas por un manejador de señales, o ambas, sin alterar el flujo de control de los valores de retorno u objetos con duración de almacenamiento automático de invocaciones anteriores (aún activas después de la interrupción). Todos estos objetos deben ser mantenidos fuera de la imagen de la función (las instrucciones que componen la representación ejecutable de una función) en base a una pre-invocación.

#### Límites del entorno

Tanto el entorno de traducción como el de ejecución restringen la implementación de traductores y bibliotecas de idiomas.

## Librerías

Librerías estándar de C :
| Librerías | Utilidad |
| assert.h | Define la macro NDEBUG. |
| Ctype.h | Define los tipos clásicos de datos de c++. |
| complex.h | Define los tipos de datos float, double y long double, además de funciones para el apoyo a la complejidad aritmética. |
| float.h | Define macros y métodos que permiten expandir la complejidad del tipo base float. |
| limits.h | Define macros que permiten expandir la complejidad del tipo base int. |
| iso64.h | Define macros que sustituyen a los operadores lógicos tradicionales. |
| errno.h | Define todas las macros relacionadas con la captura de errores. |
| math.h | Define las funciones para la realización de las operaciones algebraicas básicas. |
| stdbool.h | Define las macros bool, true y false. |
| signal.h | Define las macros controladoras de señales como SIGSTOP o SIGKILL. |
| stdio.h | Define las funciones necesarios para poder leer ficheros. |
| string.h | Define los métodos para la manipulación de tipos de datos string. |
| time.h | Define los métodos y variables para el manejo del tiempo, especialmente utilizada para la obtención de valores pseudo-aleatorios. |