【发布时间】:2021-08-13 02:06:02
【问题描述】:
我正在阅读一些实现简单解析器的代码。一个名为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*吗? -
查找位掩码的概念。基本上,0xff 转换为二进制的
11111111,或所有1的单个字节。例如,如果您只需要一个字节的数据而不是整个值(可能是多个字节),这将很有用。例如,int可能是 4 个字节,所以如果您只想要最低的 1 个字节,您可以简单地使用int_variable & 0xff来获取值。 -
在这种情况下,您实际上是在检查
bp的最低字节,丢弃可能的其他字节(通过执行& 0xff)然后查看结果是否与空白字符匹配。 -
太棒了!谢谢你。不过,我还是有点疑惑。 "bp" 是这样声明的: static const char * bp;这不是意味着 bp 总是指向一个(1 字节)字符吗?在这种情况下,在检查空格时没有其他字节可以丢弃或关心,对吧?
-
@RogerCostello 是的,但我认为这个问题与
bp的类型关系不大,更多的是与isspace的参数类型有关,即int,可能是多个字节。
标签: c char bitwise-and integer-promotion isspace