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

mar*_*lon 5 c++ string bit-manipulation bitwise-operators

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

0x80整个神秘功能是什么以及有什么作用?

Adr*_*ica 12

测试表达式的结果x & 0x80是否为非零(如您所示的代码中执行的两次),检查操作数char( x) 的最高有效位(位 7)是否设置为1。在您的情况下,代码循环遍历给定的字符串,查找设置了该位的两个连续字符(c,它是“当前”字符的副本,以及*test,下一个字符)。

\n

如果找到这样的组合,则该函数返回true;如果没有找到并且循环到达nul终止符(使c = *text++表达式变为零),则返回false。

\n

至于为什么它会进行这样的检查 \xe2\x80\x93 我只能猜测,但是,如果设置了较高位,那么该字符将不是标准 ASCII 值(并且可能是 Unicode 对中的第一个,或者某些其他多字节字符表示)。

\n
\n

可能有用的参考资料:

\n\n
\n

1请注意,此按位 AND 测试实际上是检查该位的唯一安全char方法,因为 C++ 标准允许类型为signed(其中测试负值将是替代方法)或unsigned(其中测试 >= 128 将是必需的); 如果实现的char签名类型“错误”,则这些测试中的任何一个都会失败。

\n


pm1*_*100 2

重写得不那么紧凑:

while (true)
{
    char c = *text;
    text += 1;
    if (c == '\0') // 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;
}
Run Code Online (Sandbox Code Playgroud)

MSB 表示最高有效位。位7。纯 ASCII 字符为零