c - for循环C中的 bool 条件

标签 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[] = "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 循环中, 即使 pre[i] == '\000' 也会执行 if (pre[i] != str[i]) return 0; 行。 此时是否应该满足 for 循环中的条件并且不执行最后一次比较? 我意识到将 for 条件从 || 更改为 && 符合我最初的意思,但我不明白为什么,这是我的问题。怎么会出现下面的情况 pre[i] != '\0' ||当 pre[i] == '\000' 时 str[i] != '\0' 仍然执行吗?

最佳答案

您正在使用|| ..即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'

关于c - for循环C中的 bool 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23682317/

相关文章:

c - 更快的文件和内存写入

python - 从逻辑门中删除重复的变量

logic - 测试逻辑表达式的工具

c - 仅当我对最近添加的头文件进行函数调用时链接器错误

c - 打印值、指针和指向值的指针

java - 德摩根定律

computer-science - 有按位运算符法则吗?

python - Django 根据 bool 字段设置日期

c - isspace 无法正常工作?

c++ - 在不设置环境变量的情况下在 Windows 7 中运行 MinGW gcc 编译器