В чем смысл "& &" при управлении символом char на символе в C ++?

JadenFero спросил: 28 марта 2018 в 04:40 в: c++

Я наткнулся на код, который извлек токен (строка c) из заданной строки, но меня смущает 5-я строка: tok && *tok. Я просто не могу понять результат этой операции. Кто-нибудь знает?

const char* getfield(char* line, int num)
{
    const char* tok;
    for (tok = strtok(line, ";");
            tok && *tok;
            tok = strtok(NULL, ";\n"))
    {
        if (!--num)
            return tok;
    }
    return NULL;
}

Спасибо!

3 ответа

Есть решение
Jive Dadson Sébastien S. ответил: 28 марта 2018 в 04:50

Сначала проверяется, не является ли указатель (tok) nullptr (указывает на ничто), затем, если указатель не является nullptr, он проверяет, указывает ли оно на память, где значение (*tok) не равно '\0'.

JadenFero ответил: 29 марта 2018 в 04:56
Спасибо! И еще одна вещь, появится ли сообщение об ошибке, если tok окажется нулевым указателем или '\0'?
Sébastien S. ответил: 29 марта 2018 в 05:05
Пожалуйста. Если num > 0 и tok == NULL || *tok == '\0', он вернет NULL, иначе он вернет tok. Сообщение об ошибке может появиться, если вы проверите возвращаемое значение функции при ее вызове и напечатаете сообщение, если оно вернуло NULL.
Jive Dadson Alexander Huszagh ответил: 28 марта 2018 в 04:53

Это условное выражение, и оно проверяет, что tok не является nullptr и что *tok, или символ, не является"nul" символ '\0'.

В цикле for в стиле C у вас есть инициализатор, условие и выражения приращения. Здесь условие состоит в том, что tok оценивается как true, затем *tok оценивается как true.

Это может произойти, только если tok не равно , и символ, на который указывает (nullptr), не является *tok.

Jive Dadson user1451348 ответил: 28 марта 2018 в 05:18

Значение & & остается такой же. Это все еще логический оператор. Это утверждение эквивалентно

(tok != nullptr) && (*tok != '\0');
JadenFero ответил: 29 марта 2018 в 04:52
Спасибо! это очень лаконично и понятно!