for循环C中的布尔条件

时间:2014-05-15 15:15:55

标签: c boolean-logic

以下代码旨在断言字符串是否包含特定前缀。 仅当给定的字符串包含前缀prefix时,函数pre才返回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;
}

编译并运行后,assert (errCode == 1)失败。 我通过gdb运行它,并在prefix函数内的for循环中找到它, 即使if (pre[i] != str[i]) return 0;,也会执行第pre[i] == '\000'行。 在这一点上不应该满足for循环中的条件,并且最后的比较不会被执行? 我意识到将for条件从||更改为&&就行了我的意思,但我不明白为什么,这是我的问题。怎么会出现以下情况 pre[i] != '\0' || str[i] != '\0'时仍会执行pre[i] == '\000'

1 个答案:

答案 0 :(得分:2)

您正在使用|| ..即logical or,如果其中任何一个值为true

,评估结果为true

因此对于条件pre[i] != '\0' || str[i] != '\0'pre[i]='\0'str[i]!='\0'。因此条件评估为true并进入循环。

您需要使用的是&& ..即logical and

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

实现的

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