Что означает восклицательный знак if (! Strcmp () ...?) - PullRequest
0 голосов
/ 16 января 2020

Может кто-нибудь объяснить, что делает восклицательный знак в операторе if (т.е. !strmcp)?

 string names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};

// Search for EMMA
for (int i = 0; i < 4; i++)
{
    if (!strcmp(names[i], "EMMA"))
    {
        printf("Found\n");
        return 0;
    }
}
printf("Not found\n");
return 1;

Ответы [ 5 ]

1 голос
/ 16 января 2020

Для оператора if, если выражение оценивается как 0, блок кода, следующий за оператором if, не выполняется. Любое другое значение (положительное или отрицательное) приведет к выполнению блока кода. Функция strcmp использует 0, чтобы сказать, что строки равны, потому что меньше 0 используется, чтобы отличаться от больше 0.

Так что в этом коде мы хотим, чтобы printf("Found\n"); выполнялось, когда строки равны. Поскольку strcmp приводит к 0, нам нужно отрицать значение, чтобы оно стало 1, что приведет к выполнению этого блока кода.

1 голос
/ 16 января 2020

strcmp() возвращает 0, если строки идентичны, поэтому вам нужно отрицать его, если вы используете его в предложении if для утверждения оператора true.

Если ваше предложение if(0), код внутри условия не будет выполнен.

Для завершения он возвращает отрицательное значение, если первый найденный другой символ находится ниже в первой строке, для экземпляр:

строка первого параметра: "abca"

строка второго параметра: abcd "

Возвращает отрицательное значение. Если это другой способ arround, он вернет положительное значение.

Кроме того, string обычно не используется в C (я отсылаю вас к комментарию Джонатана Леффлера), вы можете использовать char*:

char *names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};
0 голосов
/ 16 января 2020

Восклицательный знак - логический символ отрицания C. Это означает, что дайте мне логическое противоположное значение. Логическим значением является true или false, которые 1 или 0 в языке C.

В C, if операторы выполняют свои условные операторы, если аргумент правда.

if (a) означает, что a истинно (т. Е. Не ноль)
if (!a) означает, что a ложно (т. Е. 0)

Следовательно:

if (a) совпадает с if (a != 0)
if (!a) совпадает с if (a == 0)

Иногда you ' Вы увидите код, который использует два восклицательных знака подряд "!!"

Например:

int a = !!b;

То есть a будет ТОЛЬКО 0 или 1, независимо от значения b.

Если b ЛЮБОЕ ненулевое значение, оператор ! будет воспринимать его как истинное true , который он обрабатывает так же, как 1

Итак:

!0 == 1
!1 == 0
!52 == 0
!25692 == 0

Второй ! снова выполняет булеву инверсию, поэтому:

!!0 == 0
!!1 == 1
!!52 == 1
!!25692 == 1
0 голосов
/ 16 января 2020

Унарный оператор ! называется логическим оператором NOT (см., Например, это определение на cppreference.com). ! expression возвращает 1, если expression оценивается как 0, и возвращает 0, если expression оценивает что-либо еще, кроме 0.

Итак, условие в if (!0) дает 1; это означает, что условие выполнено и введен блок if. Он имеет то же значение, что и if(0==0)

Следовательно, значение

if(!strcmp(names[i], "EMMA"))

в вашем коде точно такое же, как

if(0==strcmp(names[i], "EMMA"))

И вы уже знаете когда strcmp возвращает 0 ...

0 голосов
/ 16 января 2020

В C любое ненулевое значение считается логической истиной, ноль - логическим ложным. ! - логическое отрицание. Таким образом, !0 (не ложь) будет правдой, а if(!strcmp(str1,str2)) {statements} операторы будут выполнены, когда str1 будет таким же, как str2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...