c ++ однострочный синтаксис if / else

0

Этот код меня смущает:

/* First off, we need to check if this is a call for the "example-handler" handler.
 * If it is, we accept it and do our things, if not, we simply return DECLINED,
 * and the server will try somewhere else.
 */
if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);

[Источник]

В нем говорится: "проверьте, является ли это вызовом обработчика" обработчик примера ". ЕСЛИ НЕ, мы просто возвращаем DECLINED,

Я думал, что "если (strcmp (r-> обработчик," example-handler ")) return (DECLINED)" означал, что если сравнение строк возвращает true, поэтому, если это вызов для обработчика примера, DECLINED будет вернулся.

  • 0
    @drescherjm Это часть примера кода от Apache: httpd.apache.org/docs/trunk/developer/modguide.html
  • 0
    @drescherjm И, конечно же, r->handler != nullptr . Некоторые авторы любят запутывать.
Показать ещё 1 комментарий
Теги:

3 ответа

2

Это утверждение

if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);

означает

если обработчик r-> равен NULL, тогда возвращайте DECLINED

Или, если обработчик r-> не равен NULL, но его содержимое не равно строковому литералу "пример-обработчик", а затем возвращает DECLINED

Стандартная функция C strcmp возвращает 0, если оба операнда равны друг другу и отличное от нуля значение.

Это выражение

strcmp(r->handler, "example-handler") != 0

означает, что операнды не равны друг другу.

Из стандарта C

Функция strcmp возвращает целое число, большее, равное или меньшее нуля, соответственно, поскольку строка, на которую указывает s1, больше, равна или меньше, чем строка, на которую указывает s2

0

Это выглядит правильно. strcmp возвращает 0, если это совпадение. Поэтому вы продолжите, как следует из комментариев.

0

Это условие:

if (!r->handler || strcmp(r->handler, "example-handler")) return (DECLINED);

Может быть переписано более явно, как:

if (r->handler == NULL /* or nullptr in C++11 */ || strcmp(r->handler, "example-handler") != 0) return (DECLINED);

Что в основном означает, что он возвращает DECLINED, когда:

  1. обработчик не предоставляется
  2. OR strcmp возвращает ненулевое значение.

В man-страницах strcmp вы можете узнать, что strcmp возвращает ненулевое значение, когда строка отличается:

Функция strcmp() сравнивает две строки s1 и s2. Он возвращает целое число меньше, равное или больше нуля, если s1 найдено соответственно, чтобы быть меньше, соответствовать или быть больше, чем s2.

  • 1
    Или, вернее, strcmp не возвращает bool , и поэтому не должен использоваться в контексте, где ожидается bool . Оригинальный код - чистое запутывание.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню