编译器警告我的函数将永远不会执行

时间:2019-03-13 16:59:14

标签: c

我定义了一个称为checkrow的函数,该函数读取char数组的给定元素(由指向char的指针馈送给它)并确定它是否等于某些字符。当我编译整个程序时,编译器告诉我(if(*pInput == (' ' || '\t' || '\n')))的第67行将永远不会执行。为什么?逻辑对我来说很有意义。下面是代码。

#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 个答案:

答案 0 :(得分:4)

这并不是说语句将不执行,只是其中的特定表达式。警告消息如下:

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'的箭头,这些箭头永远不会被执行。

||运算符是短路运算符,仅当左操作数为false时才执行右操作数。

在这种情况下,由于' '是一个常数,并且已知为真(char以外的任何'\0'都是真),因此其他两个操作数不需要执行以确定结果。

答案 1 :(得分:1)

您需要重写表达式:

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

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

if ( strchr(" \t\n" , *pInput) != NULL)

答案 2 :(得分:0)

||运算符仅在第一个操作数的值为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)