Функция strcmp возвращает значение в другой функции - PullRequest
0 голосов
/ 30 декабря 2018

Я знаю, что возвращает strcmp, но я не знаю, что он возвращает в этом коде.

сначала у меня есть эта функция:

static int match_str(const void *str1, const void *str2)
{

  return !strcmp((const char *)str1, (const char *)str2); 
//if not equal return 1. 
}

, а затем у меня есть

if (match_str) return 1; // not equal so return 
else{  my code goes on} // equal so continue

Что я не понимаю, так это то, что если str1 равен str2, match_str должен возвращать 0. Затем код продолжается.

, но добавляет '!'operater.кажется, что если они равны strcmp = 0, он возвращается к «! 0», что означает «! 0 = 1».но если возвращается к 1. кажется, что если они равны, он остановится.

На самом деле, это продолжается, если они равны.

Я действительно запутался, почему «return! Strcmp» работает, а не «return strcmp», какова цель использования «!»здесь.

спасибо

1 Ответ

0 голосов
/ 30 декабря 2018

Из стандарта C ## 6.5.3.3p5

5 Результат оператора логического отрицания!равно 0, если значение его операнда сравнивается с 0, 1, если значение его операнда сравнивается равным 0. Результат имеет тип int.Выражение! E эквивалентно (0 == E).

>> What I don't understand is if str1 equals to str2, the match_str should returns 0. and then the code moves on.

Из-за использования оператора ! с strcmp в операторе возврата (return !strcmp(.....)), match_str() будетвозвращает 1, если строка соответствует, и 0, если они не совпадают.

>> I really confused why " return !strcmp " works rather than "return strcmp", what is the purpose of using '!' here.

strcmp() возвращает 0, если строка соответствуети ненулевое значение, если они не совпадают, потому что он сравнивает две строки с нулевым символом в конце лексикографически.Автор функции match_str() на самом деле хотел вернуть 1, если строка соответствует и кажется, что, учитывая эту мысль, он / она дал имя (match_str) функции.Вызывающий функцию match_str() должен знать об этом при использовании функции match_str().

if (match_str(str1, str2)) {
    //strings are equal
} else {
    //strings are not equal
}
...