Каково определение "арифметической операции" в C99?
В C99 термин арифметическая операция появляется 16 раз, но я не вижу определения для него.
Термин арифметический оператор появляется только дважды в тексте (опять без определения), но он появляется в индексе:
арифметические операторы
добавка, 6.5.6, G.5.2
побитовое, 6.5.10, 6.5.11, 6.5.12
прирост и уменьшение, 6.5.2.4, 6.5.3.1
мультипликативный 6.5.5, G.5.1
сдвиг, 6.5.7
унарный, 6.5.3.3
Тогда мы имеем +
-
|
&
(двоичный) ++
--
*
(двоичный) /
%
<<
>>
~
как арифметика операторов, если Индекс считается нормативным!
Возможно, нам следует определить арифметическую операцию как использование арифметического оператора. Но F9.4.5 говорит, что функция sqrt()
также является арифметической операцией и для получения более подробной информации относится к IEC 60559 (aka. IEEE754). Таким образом, должны быть арифметические операции, которые не являются просто использованием арифметических операторов.
Ответы
Ответ 1
Поскольку у нас нет формального определения, посмотрим, можем ли мы объединить логическую интерпретацию того, что должно быть арифметической операцией. Это будет умозрительно, но я не могу найти очевидных отчетов о дефектах или открытых проблемах, которые охватывают это.
Я предполагаю, что я начну с того, что считается арифметическим типом, который описан в разделе 6.2.5
В параграфах 18-го типа говорится (выделение моего хода):
Целочисленные и плавающие типы совместно называются арифметическими типами.Каждый арифметический тип относится к одному типу домена: домен реального типа содержит реальные типы, домен комплексного типа содержит сложных типов.
ok, поэтому мы знаем, что арифметическая операция должна работать либо с целым числом, либо с типом с плавающей точкой. Итак, что такое операция? Похоже, мы неплохо разбираемся в том, что из раздела 5.1.2.3
Пункт 2 выполнения программы, который гласит:
Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции, которая выполняет любую из тех операций, все стороны эффекты, 11) которые являются изменениями в состоянии выполнения Окружающая среда. [...]
Таким образом, для модификации объекта или вызова функции, которая делает это, это операция. Что такое объект? Раздел 3.14
говорит:
область хранения данных в среде исполнения, содержимое который может представлять значения
Хотя стандарт, по-видимому, использует термин "операция" более слабо, чтобы означать оценку, например, в разделе 7.12.1
"Обработка условий ошибки":
Поведение каждой из функций в задано для всех представляемые значения его входных аргументов, за исключением случаев, когда указано в противном случае. Каждая функция должна выполняться так, как если бы она была одиночной без создания видимых внешних исключений условия.
и в разделе 6.5
Выражения, пункт 8, который гласит:
Плавающее выражение может быть сжато, то есть оценено как бы это была атомная операция [...]
Таким образом, это означает, что оценка - это операция.
Таким образом, из этих разделов видно, что почти все арифметические операторы и любая математическая функция попадают под обычное определение арифметической операции.
Ответ 2
Самый убедительный бит, который я мог бы найти неявным определением, заключается в 7.14 Signal Handling, пункт 3, в определении сигнала SIGFPE:
SIGFPE - ошибочная арифметическая операция, такая как деление нуля или операция, приводящая к переполнению
Затем можно сделать вывод, что любая операция, которая может вызвать повышение SIGFPE, может рассматриваться как арифметическая операция; только арифметические операции могут привести к повышению сигнала SIGFPE.
Это покрывает почти что угодно в <math.h>
и арифметических операциях, а <complex.h>
, если оно реализовано. В то время как сигнал не может быть поднят для интегральных типов, подписанное переполнение и другие "исключительные" условия позволяют генерировать ловушки, что означает, что никакие другие операции не могут выполняться надежно до тех пор, пока не будет получено действительное значение - что-то, что можно сделать только через назначение. Другими словами, определение может применяться в равной степени к операциям с интегральным значением.
В результате практически любая операция, отличная от получения размера объекта/типа, разыменования указателя и принятия адреса объекта, может рассматриваться как арифметическая операция. Обратите внимание, что a[n]
- *((a) + (n))
, поэтому даже использование массива можно считать арифметической.
Ответ 3
Арифметическая операция включает в себя манипулирование числами. sqrt
также управляет числами, и это может быть причиной того, что стандарт говорит об арифметической операции.