Как изменить аргумент «const» на «неконстантный» при вызове функции в C

В Java, когда оператор «==» используется для сравнения двух объектов, он проверяет, ссылаются ли объекты на одно и то же место в памяти. Другими словами, он проверяет, являются ли имена двух объектов в основном ссылками на одно и то же место в памяти.

Класс Java String фактически переопределяет реализацию equals () по умолчанию в классе Object и переопределяет этот метод, чтобы он проверял только значения строк, а не их местоположения в памяти. Это означает, что если вы вызываете метод equals () для сравнения двух объектов String, то, пока действительная последовательность символов равна, оба объекта считаются равными.

Оператор == проверяет, являются ли две строки точно одним и тем же объектом.

Метод .equals() проверяет, имеют ли две строки одно и то же значение.

1
задан chqrlie 10 March 2019 в 07:02
поделиться

4 ответа

В C вы можете напрямую использовать его для удаления свойства const.

void *table_lookup(const table *t)
//Here I want to call my other function. 
table_remove((table*)t)   // remove 'const' by directly casting.
...
return

void table_remove(table *t)
...
0
ответ дан Yuanhui 10 March 2019 в 07:02
поделиться

Вы НЕ должны выбрасывать квалификатор const. Любая попытка впоследствии изменить значение, которое было квалифицировано const, вызывает Неопределенное поведение . См. Стандарт C11 - 6.7.3 Классификаторы типов (p6) .

Параметр table_lookup соответствует const по определенной причине. Это позволяет компилятору оптимизировать использование t. Если вы отбрасываете const и пытаетесь изменить t, вы нарушаете свое обещание компилятору, что t не будет изменено.

Вместо этого вы должны реорганизовать свой код, чтобы функция remove() вызывала внутри него table_lookup, чтобы получить указатель (предположительно) на узел, который вы хотите удалить. Затем удалите node. Не пытайтесь добавить remove() в table_lookup. Создайте новую функцию.

0
ответ дан David C. Rankin 10 March 2019 в 07:02
поделиться

Вы можете отбросить квалификатор const: table_remove((table *)t);, но у вас могут возникнуть проблемы, если table_remove попытается изменить структуру table, например, если она хранится в чтении только сегмент.

Поэтому вы не должны делать это. Довольно неожиданно, что функция поиска все равно изменит таблицу. Если это происходит по уважительным причинам, таким как создание хеш-таблицы или поддержка кэша, аргумент не должен быть объявлен как const.

0
ответ дан chqrlie 10 March 2019 в 07:02
поделиться

Да. Это верно. это была плохая идея - отбросить константный квалификатор. , Я также не могу добавить новую функцию. ((таблица) *) дает проблему.

0
ответ дан Hakan Strom 10 March 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: