Компилятор предупреждает, что моя функция никогда не будет выполнена - PullRequest
1 голос
/ 13 марта 2019

Я определил функцию с именем checkrow, которая считывает данный элемент массива char (передается ему указателем на char) и определяет, равен ли он определенным символам. Когда я компилирую мою общую программу, компилятор сообщает мне, что строка 67, которая равна (if(*pInput == (' ' || '\t' || '\n'))), никогда не будет выполнена. Зачем? Логика имеет смысл для меня. Ниже приведен код.

#include <stdio.h>
#include <stdlib.h>

int checkRow(char *pArray);

int main (void){

    char c = 0;
    int high = 0;
    int low = 9;
    int checksum = 0;
    char input[3000];
    char *pInput = input;
    FILE *pFile = NULL;

    pFile = fopen("foo.txt", "r");
    if (pFile == NULL){
        printf("failed to open file\n");
        return (-1);
    }

    while((c = fgetc(pFile)) != EOF){
        *pInput = c;
        ++pInput;
    }

    fclose(pFile);
    pFile = NULL;
    pInput = input; //point pInput back to the address of the first element of input
    //printf("the checksum is %d\n", checksum(pInput));
    while(*pInput){

        if(checkRow(pInput) == 0){
            checksum += (high - low);
            ++pInput;
            continue;
        }
        else{
            if((*pInput - '0') > high && (*pInput - '0') < low){
            high = *pInput - '0';
            low = *pInput - '0';
            ++pInput;
            continue;
            }
            else if (*pInput - '0' > high){
            high = *pInput - '0';
            ++pInput;
            continue;
            }
            else if(*pInput - '0' < low){
            low = *pInput - '0';
            ++pInput;
            }
        }

    }

    printf("this is the checksum %d\n", checksum);
    getchar();
    return 0;
}

int checkRow(char *pInput){

    int in = 0;

    if(*pInput == (' ' || '\t' || '\n'))
        in = 0;
    else
        in = 1;
    return in;
}

Ответы [ 3 ]

4 голосов
/ 13 марта 2019

Это не говорит о том, что оператор не будет выполнен, просто конкретные выражения внутри него.Предупреждающее сообщение выглядит следующим образом:

testcompare.c:67:35: warning: code will never be executed [-Wunreachable-code]
    if(*pInput == (' ' || '\t' || '\n'))
                                  ^~~~
testcompare.c:67:27: warning: code will never be executed [-Wunreachable-code]
    if(*pInput == (' ' || '\t' || '\n'))
                          ^~~~

Обратите внимание на стрелки, указывающие на '\n' и '\t', они говорят, что никогда не будут выполнены.

Оператор ||является оператором короткого замыкания, он выполняет правый операнд, только если левый операнд является ложным.

В этом случае, поскольку ' ' является константой, и известно, что она истинна (любая charкроме '\0' (верно), два других операнда не нужно выполнять для определения результата.

1 голос
/ 13 марта 2019

Вам необходимо переписать выражение:

if(*pInput == (' ' || '\t' || '\n'))

как

if(*pInput ==' ' || *pInput =='\t' || *pInput =='\n'))

или

if ( strchr(" \t\n" , *pInput) != NULL)
0 голосов
/ 13 марта 2019

Оператор || оценивает свой второй операнд, только если первый операнд оценивается как 0.

Так что в ' ' || '\t' || '\n' последний операнд никогда не вычисляется, потому что ' ' || '\t' не равен нулю.

С другой стороны, вы хотите написать что-то вроде

(*pInput == ' ') || (*pInput == '\t') || (*pInput == '\n')

Другая ошибка, которую вы допустили, вы забыли вставить окончательный 0 в строку input

while((c = fgetc(pFile)) != EOF){
    *pInput = c;
    ++pInput;
}

fclose(pFile);
pFile = NULL;
*pInput = 0;       /* THIS IS IMPORTANT */
pInput = input;  

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