我定义了一个称为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;
}
答案 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)