Pregunta ¿Cuál es la definición de "operación aritmética" en C99?


En C99, el término operación aritmética aparece 16 veces, pero no veo una definición para él.

El termino operador aritmético solo aparece dos veces en el texto (nuevamente sin definición) pero aparece en el índice:

operadores aritméticos

aditivo, 6.5.6, G.5.2
    en modo bit, 6.5.10, 6.5.11, 6.5.12
    incremento y decremento, 6.5.2.4, 6.5.3.1
    multiplicativo 6.5.5, G.5.1
    desplazamiento, 6.5.7
    unario, 6.5.3.3

Entonces nosotros tenemos +  -  |  &(binario) ++  --  *(binario) /  %  <<  >>  ~ como operadores aritméticos, si el Índice se considera normativo.

Tal vez deberíamos identificar operación aritmética como el uso de un operador aritmético. Pero F9.4.5 dice que el sqrt() la función también es una operación aritmética, y se refiere a IEC 60559 (también conocido como IEEE754) para más detalles. Entonces debe haber operaciones aritméticas que no sean solo el uso de operadores aritméticos.


13
2017-07-10 00:43


origen


Respuestas:


Como no tenemos una definición formal, veamos si podemos reconstruir una interpretación racional de qué operación aritmética debiera ser. Esto será especulativo, pero no puedo encontrar ningún informe de defectos obvio o problemas abiertos que lo cubran.

Supongo que comenzaría con lo que se consideran tipos aritméticos, que se trata en la sección 6.2.5  Tipos párrafo 18 dice (énfasis mío en el futuro)

Los tipos enteros y flotantes se denominan colectivamente tipos aritméticos.   Cada tipo aritmético pertenece a un dominio de tipo: el dominio de tipo real   comprende los tipos reales, el dominio de tipo complejo comprende el   tipos complejos.

ok, entonces sabemos que una operación aritmética tiene que operar en un entero o en un tipo de coma flotante. Entonces, ¿qué es un operación? Parece que tenemos una buena oportunidad para definir eso de la sección 5.1.2.3  Ejecución del programa párrafo 2 que dice:

Acceder a un objeto volátil, modificar un objeto, modificar un archivo o   llamando a una función que hace cualquiera de esas operaciones son todos lados   efectos,11) que son cambios en el estado de la ejecución   ambiente. [...]

Entonces, modificar un objeto o llamar a una función que lo haga, es una operación. Que es un objeto? Sección 3.14 dice:

región de almacenamiento de datos en el entorno de ejecución, los contenidos de   que puede representar valores

Aunque el estándar parece usar el término operación más vagamente para significar una evaluación, por ejemplo en la sección 7.12.1  Tratamiento de las condiciones de error dice:

El comportamiento de cada una de las funciones en se especifica para todos   valores representables de sus argumentos de entrada, excepto cuando se indique   de otra manera. Cada función se ejecutará como si fuera una sola   operación sin generar ningún excepcional externamente visible   condiciones

y en la sección 6.5  Expresiones párrafo 8 que dice:

Se puede contraer una expresión flotante, es decir, evaluar como si   fue una operación atómica [...]

Entonces esto parece implicar que una evaluación es una operación.

Por lo tanto, parecería de estas secciones que prácticamente todos los operadores aritméticos y cualquier función matemática caería bajo una definición de sentido común de operación aritmética.


7
2017-07-10 01:42



El bit más convincente que pude encontrar para ser una definición implícita yace en 7.14 Manejo de señal, párrafo 3, en la definición de la señal SIGFPE:

SIGFPE: una operación aritmética errónea, como una división cero o una operación que da como resultado un desbordamiento

Se podría llegar a la conclusión de que cualquier operación que pueda provocar la elevación de SIGFPE puede considerarse una operación aritmética; solo las operaciones aritméticas pueden hacer que la señal SIGFPE se eleve.

Eso cubre prácticamente cualquier cosa en <math.h> y los operadores aritméticos, y <complex.h> si se implementa Si bien una señal no se puede generar para tipos integrales, el desbordamiento firmado y otras condiciones "excepcionales" permiten generar representaciones de trampas, lo que significa que no se pueden realizar otras operaciones de manera confiable hasta que se obtenga un valor válido, algo que solo puede hacerse a través de asignación. En otras palabras, la definición puede aplicarse igualmente a operaciones en un valor integral.

Como resultado, prácticamente cualquier operación que no sea obtener el tamaño de un objeto / tipo, desreferenciar un puntero y tomar la dirección de un objeto se puede considerar una operación aritmética. Tenga en cuenta que a[n] es *((a) + (n)), por lo que incluso el uso de una matriz se puede considerar una operación aritmética.


3
2017-07-10 01:54



Una operación aritmética implica manipulación de números. sqrt también manipular números y esa podría ser la razón por la que el estándar lo dice una operación aritmética.


1
2017-07-10 00:51