这段与 char 字符串相关的 C++ 代码有什么作用?

What does this char string related piece of C++ code do?

bool check(const char *text) {
    char c;
    while (c = *text++) {
        if ((c & 0x80) && ((*text) & 0x80)) {
            return true;
        }
    }
    return false;
}

什么是0x80以及整个神秘函数的作用是什么?

测试 non-zero 的 x & 0x80 表达式的结果(在您显示的代码中做了两次)检查 char 的最高有效位(第 7 位)操作数 (x) 设置为 1。在您的情况下,代码循环遍历给定的字符串以查找两个 连续的 字符(c,它是 'current' 字符的副本,以及 *test,下一个)设置了那个位。

如果找到这样的组合,函数returns true;如果未找到且循环到达 nul 终止符(因此 c = *text++ 表达式变为零),则它 returns false.

至于为什么它做这样的检查——我只能猜测但是,如果高位设置,那么字符不会是标准的 ASCII 值(并且 可能 是 Unicode 对中的第一个,或其他一些 multi-byte 字符表示形式)。


可能有用的参考资料:


1 请注意,这种按位与测试确实是检查该位的唯一 安全 方法,因为 C++ 标准允许 char 类型为 signed(测试负值是替代方法)或 unsigned(需要测试 >= 128);如果实现的 char 具有 'wrong' 类型的签名,那么这些测试中的任何一个都会失败。

如果没有更多上下文,我无法完全确定,但在我看来,此函数会检查字符串是否包含经典 7 位 US-ASCII 范围之外的任何 UTF-8 字符。

while (c=*text++) 将循环直到在 C-style 字符串中找到 nul-terminator;将每个 char 分配给 cc & 0x80 检查是否设置了 c 的 most-significant-bit。 *text & 0x80text 指向的 char 做同样的事情(这将是 c 之后的那个,因为它是作为 while 条件的一部分递增的).

因此,如果 text 指向的字符串中任意两个相邻的 char 设置了 most-significant-bit,则此函数将 return true。 UTF-8 中任何代码点 U+0080 及以上都是这种情况;因此我猜这个函数是用来检测UTF-8文本的。

改写得不那么紧凑:

while (true)
{
    char c = *text;
    text += 1;
    if (c == '[=10=]') // at the end of string?
        return false;
    
    int temp1 = c & 0x80;          // test MSB of c
    int temp2 = (*text) & 0x80;    // test MSB of next character
    if (temp1 != 0 && temp2 != 0)  // if both set the return true
        return true;
}

MSB 表示最高有效位。 Bit7.纯 ascii 字符为零