Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环C中的布尔条件_C_Boolean Logic - Fatal编程技术网

循环C中的布尔条件

循环C中的布尔条件,c,boolean-logic,C,Boolean Logic,以下代码用于断言字符串是否包含某个前缀。 仅当给定的字符串包含前缀pre时,函数prefix才会返回1 /* preprocessor directives */ #include <stdlib.h> #include <assert.h> /* prototypes */ int prefix(char * pre, char * str); int main() { /* declaration / initialization */ char

以下代码用于断言字符串是否包含某个前缀。 仅当给定的字符串包含前缀
pre
时,函数
prefix
才会返回1

/* preprocessor directives */
#include <stdlib.h>
#include <assert.h>

/* prototypes */
int prefix(char * pre, char * str);

int main() {
    /* declaration / initialization */
    char pre[] = "Hell", str1[] = "Hello!", str2[] = "hi!";
    int errCode = prefix(pre, str1);

    /* processing */
    assert (errCode == 1);
    errCode = prefix(pre, str2);
    assert (errCode == 0);

    errCode = prefix(NULL, str2);
    assert (errCode == 0);
        errCode = prefix(pre, NULL);
    assert (errCode == 0);

    /* termination */
    return 0;
}

/* Returns 0 if pre or str is NULL or if pre is not a prefix of str.
 * Otherwise returns 1.
 */
int prefix(char * pre, char * str) {
        /* declaration / initialization */
    int i;

    /* processing */
    if (pre == NULL || str == NULL) return 0;

    for (i = 0; pre[i] != '\0' || str[i] != '\0'; i++)
        if (pre[i] != str[i]) return 0;

    if (pre[i] != '\0') return 0;

    /* termination */
    return 1;
}
/*预处理器指令*/
#包括
#包括
/*原型*/
int前缀(char*pre,char*str);
int main(){
/*声明/初始化*/
char pre[]=“地狱”,str1[]=“你好!”,str2[]=“你好!”;
int errCode=前缀(pre,str1);
/*加工*/
断言(errCode==1);
errCode=前缀(pre,str2);
断言(errCode==0);
errCode=前缀(空,str2);
断言(errCode==0);
errCode=前缀(pre,NULL);
断言(errCode==0);
/*终止*/
返回0;
}
/*如果pre或str为NULL或pre不是str的前缀,则返回0。
*否则返回1。
*/
int前缀(char*pre,char*str){
/*声明/初始化*/
int i;
/*加工*/
if(pre==NULL | | str==NULL)返回0;
对于(i=0;pre[i]!='\0'| | str[i]!='\0';i++)
如果(pre[i]!=str[i])返回0;
if(pre[i]!='\0')返回0;
/*终止*/
返回1;
}
编译并运行后,
assert(errCode==1)
失败。 我通过gdb运行它,发现在for循环的
prefix
函数中, 行
if(pre[i]!=str[i])返回0pre[i]='\000'
时也会执行code>。 此时是否应该满足for循环中的条件,并且不执行最后一次比较?? 我意识到将for条件从
|
更改为
&&
符合我最初的意思,但我不明白为什么,这是我的问题。为什么会出现以下情况
pre[i]!='\0'| | str[i]!='\当您使用
|
时,
pre[i]='\000'

仍将执行0'
。即
逻辑或
,如果其中任何一个值为

所以对于条件
pre[i]!='\0'| | str[i]!='\0'
,尽管
pre[i]='\0'
str[i]!='\0'
。因此,条件的计算结果为
true
,并进入循环

您需要使用的是
和&
。即
逻辑和

简单来说,循环直到两个字符串都不是“\0”,这是通过

pre[i]!='\0'&&str[i]!='\0'