Восклицательная запись и функция `strcmp` в программировании C - PullRequest
3 голосов
/ 07 апреля 2020

Есть вопрос, который меня смущает во время обучения на курсе Гарвардского университета CS50. Следующий вопрос беспокоит меня долгое время.

Для следующего кода он хочет сравнить строку с именем "EMMA" с массивом с именем "names", который содержит 4 имени внутри.

#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    // An array of names
    string names[] = {"EMMA", "RODRIGO", "BRIAN", "DAVID"};

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

В приведенных выше кодах он использует if (strcmp(names[i], "EMMA") == 0) для проверки имени "EMMA".

Однако он также будет работать, если я напишу код другим способом, как если бы я заменил if (strcmp(names[i], "EMMA") == 0) с if (!strcmp(names[i], "EMMA")), и получается тот же ответ «Найдено».

Если мне не изменяет память, то восклицание ! в C означает «НЕ». В первом методе используются два знака равенства, равные express, значение получается одинаковым с 0. Но во втором методе используются восклицательные знаки перед функцией strcmp. Я не знаком со смыслом того, почему он также дает тот же результат во втором методе, хотя я посмотрел определение функции strcmp.

Более того, было бы здорово, если бы кто-то мог сказать мне какое значение даст функция strcmp и каково правильное выражение в простых словах?

Ответы [ 4 ]

4 голосов
/ 07 апреля 2020

Оператор ! используется для логического отрицания.

!0 совпадает с 1 (true)

!1 совпадает с 0 ( false)

Фактически, каждое ненулевое целое число равно true в C, и только 0 равно false.

Итак, если strcmp(names[i], "EMMA") == 0 истинно

Тогда !strcmp(names[i], "EMMA") также верно, потому что !0 - это true.

Более того, было бы замечательно, если бы кто-то мог сказать мне, какое значение даст функция strcmp и что является правильным Выражение в простых словах?

Проверьте эту ссылку .

Короче говоря,

strcmp может вернуть три возможных значения:

0 , если обе строки равны

положительное целое число , если первая строка больше второй строка

отрицательное целое число , если первая строка меньше второй строки

3 голосов
/ 07 апреля 2020

Как вы можете видеть здесь , функция strcmp возвращает 0, если две строки идентичны, в противном случае она возвращает либо положительное, либо отрицательное целое число. Причина, по которой второй метод также работает, связана со свойством C (и многими другими языками), где, хотя значение имеет тип integer, оно может быть приведено к логическому (true или false) типу. Это означает, что когда вы делаете !0, вы получите значение true, потому что 0 оценивается как false, а применение оператора ! переводит его в true. Любое целочисленное значение (положительное или отрицательное), отличное от 0, приведет к значению true, поэтому, например, !1 приведет к false, поскольку ! переворачивает значение.

1 голос
/ 07 апреля 2020

посмотрите на это

int a=1;
while(a)
{
//do something
}

. Вышеприведенный пример означает выполнение в то время как a!=0, и если вы используете это

int a=1;
while(!a)
{
//do something
}

, это означает, что в то время как a==0

this if(!strcmp(names[i], "EMMA")) является логическим значением. который говорит, что если !strcmp(names[i], "EMMA") истинно, введите оператор, что означает, что если !0 произойдет, введите оператор, потому что !false эквивалентно true.

1 голос
/ 07 апреля 2020

Ответ на ваш вопрос, strcmp вернет ненулевое значение, если строки разные, и ноль, если они равны.

Если вы примените оператор ! логического отрицания к 0, он будет оценен как true, если вы примените его к ненулевому значению, он будет равен false, так что условие имеет одинаковое логическое значение в обоих методах.

...