小编Bre*_*ius的帖子

如何区分' - '运算符与标记化程序的负数

我正在创建一个中缀表达式解析器,所以我必须创建一个tokenizer.它运作良好,除了一件事:我现在不知道如何区分负数和" - "运算符.

例如,如果我有:

23 / -23
Run Code Online (Sandbox Code Playgroud)

该标记应该是23,/-23,但如果我有这样的表达

23-22
Run Code Online (Sandbox Code Playgroud)

那么代币应该是23,-22.

我找到了一个肮脏的解决方法,如果我遇到一个" - "后跟一个数字,我看看前面的字符,如果这个字符是数字或')',我把" - "视为一个操作符而不是数.除了有点难看之外,它不适用于像

--56
Run Code Online (Sandbox Code Playgroud)

它得到了如下的标记:--56它应该得到--56

有什么建议吗?

c parsing token

6
推荐指数
1
解决办法
1150
查看次数

如何确定一个字节中的一个字节是否为空

我正在从 glibc 读取“strlen”源代码,开发人员发现加快它的技巧是读取 n 个字节,其中 n 是一个长字的大小,而不是在每次迭代时读取 1 个字节。

我假设一个长字有 4 个字节。

棘手的部分是函数读取的每个 4 字节的“块”都可以包含一个空字节,因此在每次迭代时,函数必须检查块中是否有空字节。他们这样做

if (((longword - lomagic) & ~longword & himagic) != 0) { /* null byte found */ }
Run Code Online (Sandbox Code Playgroud)

哪里longword是数据块,himagiclowmagic是神奇的值,定义为:

himagic = 0x80808080L;
lomagic = 0x01010101L;
Run Code Online (Sandbox Code Playgroud)

这是对这些值的评论

/* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
 the "holes."  Note that there is a hole just to the left of
 each byte, with an extra at …
Run Code Online (Sandbox Code Playgroud)

c magic-numbers strlen

3
推荐指数
1
解决办法
1986
查看次数

标签 统计

c ×2

magic-numbers ×1

parsing ×1

strlen ×1

token ×1