Подтвердить что ты не робот

Каково определение "арифметической операции" в 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). Таким образом, должны быть арифметические операции, которые не являются просто использованием арифметических операторов.

4b9b3361

Ответ 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 также управляет числами, и это может быть причиной того, что стандарт говорит об арифметической операции.