В C прототипом функции абсолютного значения (которая принимает число с плавающей запятой) является
float fabsf( float );
Почему этот прототип не принимает постоянное значение, например так:
float fabsf( float const );
fabsf не изменит значение ввода, не так ли?
Если у меня есть функция, которая принимает ввод и вызывает fabsf, я вынужден избегать указания ввода как const?
Как правильно обращаться с константностью в этой ситуации?
c
function
const
pass-by-value
user24205
источник
источник
const
здесь избыточно, что, по-вашему, происходит?const
совершенно бессмысленно.float const x = -1.0; float y = fabsf(x);
так что мне кажется, чтоfabsf
он принимает входные данные const. Невозможно сказать: «Вы можете передать мнеfloat
по значению, но вы не можете передатьconst float
». (И, как мы видим из ответов, C не предоставляет способ требовать , чтобы входные данные для функции были afloat const
.)Ответы:
редактировать
Как отметил М., от параметров в прототипах
const
игнорируются. Отредактированный источник исходного ответа (см. Ниже) показывает это:Там нет сообщения об ошибке.
В любом случае, я оставлю оригинал на месте в надежде, что он поможет.
оригинал
Параметр
const
at делает этот параметр доступным только для чтения внутри функции.Например:
Этот источник не будет компилироваться без сообщения об ошибке.
Функция
correct()
прочитает данное значение, изменит его знак и вернет отрицательное значение.erroneous()
Кажется, что функция делает то же самое, за исключением того, что этому параметру присваивается значение. Но в качестве параметраconst
это не допускается.Далее функция
changer()
будет работать как раньше, но не дает ошибок.Давайте посмотрим на сайт вызова:
Переменная,
f
заданная в качестве аргумента, будет скопирована в параметрvalue
. Он никогда не изменится, даже еслиchanger()
будет вызван.Вы можете посмотреть на параметры как на какие-то локальные переменные. На самом деле они в основном обрабатываются так в сгенерированном машинном коде.
Итак, почему ты видишь
const
иногда? Вы видите это, если указатель определен как параметр.Если вы не хотите, чтобы значение, на которое указывает указатель, было изменено, вам нужно добавить
const
; но делай это в правильном положении!источник
float fabsf( float const );
имеет ничего общего с реализацией функции (которая не должна повторятьconst
), на самом делеconst
она полностью игнорируется в прототипеC использует проход по значению. Значение параметра функции является копией аргумента, который вы даете.
Можно копировать как константные, так и неконстантные числа с плавающей точкой, и в результате получается неконстантное число с плавающей точкой.
Это похоже на назначение:
Фактически, в языке указывается, что значением выражения никогда не может быть
const
, т. Е. Когда значение читается из переменной, это значение отсутствует,const
даже если переменная была.источник
Поскольку язык C использует семантику передачи по значению, любой передаваемый ему аргумент, хотя он может быть изменен внутри, напрямую не влияет на передаваемое вами значение.
Это означает, что с точки зрения звонящего
float fabsf( float );
иfloat fabsf( const float );
совпадают. Так что нет смысла делать параметрconst
.Здесь имеет смысл использовать
const
, если передаваемый параметр является указателем, например:Эта функция, несмотря на то, что предлагает имя, может разыменовать данный указатель и изменить то, на что он указывает, т.
str[0] = 'x'
Е. Привести к изменению, видимому вызывающей функцией. Если бы эта функция была определена так:Вызывающая сторона гарантирует, что функция не может выполнять какие-либо изменения в том, на что
str
указывает.источник
((char*)str)[0] = 'f'
. Поэтомуconst ... *
в списке аргументов есть только «декларация о намерениях».Чтобы добавить точку зрения юриста по языку:
Это означает, что эти два совместимы:
Поэтому вы можете написать прототип с или без
const
(что означает, что без имеет больше смысла; меньше для ввода / чтения) и можете добавитьconst
определение функции, если вы хотите избежать случайного изменения параметра (copyied - call by value!) Внутри функций. тело.источник