2015-06-22 3 views
1

В стандарте ANSI C явно не указаны какие-либо подробности API для сложных арифметических операторов (+, -, *, /), хотя кажется, что реализация позволяет использовать эти примитивы. Мне интересно, как это возможно, поскольку C не реализует концепцию перегрузки оператора? Моя мысль заключается в том, что реализация макросов с указанием типа complex, скорее всего, будет использовать встроенный тип, который делает, разрешать такие операции, но я тогда задаюсь вопросом, как комплексное число может допускать такой же диапазон значений, как, например, одно число с плавающей запятой (так как это должно было бы как-то быть представлено в виде пары из них, я бы подумал, что его диапазон будет сокращен вдвое)?Как сложные арифметические операторы, реализованные в C?

Я думаю о правильных строках, или я нахожусь в стороне от этого?

+2

«макросы, определяющие сложный тип» - какие макросы? '_Complex' встроен в язык (и макрос' complex' предоставляется для удобочитаемости) –

+0

Таким образом, тип '_Complex' не может быть реализован библиотекой, а также арифметические операторы встроены в язык, а не в библиотеку ? (как и с любыми другими встроенными типами?) – jwalk

+0

Да, это правильно. Библиотека должна иметь указанные функции библиотеки, которые принимают сложные значения (например, 'cabs') –

ответ

3

С делает имеет перегрузки операторов - даже до стандарта C89, он перегружена операторы, как +, -, * и / для обоих целочисленных и операций с плавающей запятой.

C не имеет пользователь, заданный пользователем Перегрузка оператора - поэтому существует только фиксированный набор перегрузок, определенных в стандарте, и их способ не распространяется.

C99 просто расширяет перегрузку операторов int/float до сложных чисел. По-прежнему нет возможности для программы продлить перегрузку за пределы, указанные в спецификации.

+0

Я думал, что перегрузка оператора * была * функцией для пользователя (например, C++). Спасибо за разъяснение. – jwalk

2

Поскольку сложные типы C99 являются необязательной частью языка C, включая поддержку всей арифметической операции.

И чтобы ответить на ваш вопрос о представлении, они определяются как пары реальной и мнимой частей, как и следовало ожидать.

Ваша ссылка на что-то вроде «ANSI C» не определена, потому что все стандарты ISO C обычно принимаются и ANSI. Так что проще ссылаться на разные версии C через год публикации C89, C99 и C11.

+0

Поддержка комплекса обязательна для C99, но необязательна для C11. Только опция (для обоих) совместима с ISO/IEC 60559. – Olaf

+0

Чтобы быть немного nitpicky: ваш «C89» должен быть «C90» (C89 - ANSI, C90 - ISO). – cremno

+0

@Olaf, в C99, сложные типы являются необязательными для автономных условий окружающей среды, поэтому они не могут считаться частью основного языка даже тогда. –

Смежные вопросы