我正在阅读一些实现简单解析器的代码。一个名为scan
的函数将一行文本分解成标记。函数scan
有一个静态变量bp
,用于指定需要分解为标记的行。在赋值后,空格被跳过。请参见下面的代码。我不理解的是代码为什么要将bp
所指向的字符与0xff
进行按位与操作,即* bp & 0xff
的目的是什么?这个操作的作用是什么?
while (isspace(* bp & 0xff))
++ bp;
与此不同:
while (isspace(* bp))
++ bp;
这里是scan
函数:
static enum tokens scan (const char * buf)
/* return token = next input symbol */
{ static const char * bp;
while (isspace(* bp & 0xff))
++ bp;
..
}
isspace
函数,如果*bp
的值不能表示为unsigned char
并且不等于EOF
,其行为是未定义的。因此,可能需要使用一个复杂的强制类型转换,而不是使用(unsigned char) *bp
。请问bp
是char*
类型吗? - Ted Lyngmobp
的最低字节,通过执行& 0xff
来丢弃可能的其他字节,然后查看结果是否与空格字符匹配。 - h0r53bp
的类型关系较小,更多地与isspace
的参数类型有关,它是一个int
,可能是多个字节。 - h0r53sizeof('a')
] 哦,还有char的符号。 - wildplasser