Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Const char * сравнение с ==

Автор вопроса: Fausto Carvalho Marques SilvaОтветов: 5

У меня есть функция, которая возвращает const char * в фиксированное значение, и когда я использую эту функцию, я использую оператор "==", чтобы найти равенство между возвращаемым значением и тем, которое я ожидаю. Это хорошая практика? Должен ли это быть анти-шаблон? Бывший:

const char * LOL = "LOL";

const char * getI() {
    return LOL;
}

main {
    if (getI() == LOL)
        something();
}
  • Дубликат stackoverflow.com/questions/2440420/ user470379 05.04.2011
  • Этот возможный дубликат касается того, как вы должны сравнивать содержимое строки. Вопрос может быть не об этом. nos 05.04.2011
  • Каждый раз, когда я вижу LOL, я начинаю смеяться. Я должен быть ботаником. Marlon 05.04.2011

carraysdesign-patternsconstantschar

Ответы

Ответ 1 · рейтинг 7 · James McNellis

Это хорошая практика?

Ну, это зависит.

Это правильно делать тогда и только тогда, когда вы хотите проверить, указывает ли указатель, возвращаемый getl(), на тот же строковый литерал, что и глобальный указатель LOL. Если это не то, что вы хотите сделать, то нет, это не очень хорошая практика.

Ответ 2 · рейтинг 3 · Matthias Wandel

Это зависит от. Если вы пытаетесь обнаружить, что экземпляры строк одинаковы, это правильно. Если вы пытаетесь определить, совпадает ли содержимое строк, то это не так.

Ответ 3 · рейтинг 2 · usul

Как говорили другие, это зависит от того, что вы хотите сделать.

Когда вы говорите "ценность, которую я ожидаю", что вы имеете в виду? Чего ожидаете вы?

Не зная вашего ответа на это: в общем, плохая практика. Насколько мне известно, компиляторы могут повторно использовать расположение строк. Итак, это поведение:

const char *LOL = "lol";
const char *test = "lol";
return (test == LOL);

не является четко определенным.

Ответ 4 · рейтинг 1 · slezica

Ну... вы пытаетесь вернуть значение с глобальным именем, чтобы код был более читабельным, верно? (если я неправильно истолковал, игнорируйте: P). Рассуждение прекрасное, но это не тот путь.

Обычный способ сделать это #define:

#define MY_MEANINGFUL_RETURN 1

int doSomething() {
    return MY_MEANINGFUL_RETURN;
}

(...)
    if (doSomething() == MY_MEANINGFUL_RETURN)
(...)

Если бы вы использовали описанную выше технику const char*, вам пришлось бы сохранять эти строки в памяти во время выполнения, чтобы затем сравнивать только их позицию в памяти. При втором подходе компилятор управляет числами, и вы получаете красивые имена, не требуя дополнительного времени или места.

Ответ 5 · рейтинг 1 · Viren

Идентичность объекта против равенства:

Если вы собираетесь использовать его как способ/конструкцию для "идентификации" объектов (в данном случае глобальный указатель LOL, который фактически является просто ТАКИМ ЖЕ объектом в вашей строке кода), то это безопасно.

Но при более глубоком рассмотрении вашего примера кажется, что вы действительно хотите проверить "равенство": т.е. проверить, равны ли два объекта, т.е. содержат ли они одинаковое значение?

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы