函数 isdigit 可以用一个字符调用,但是如果我们发送一个带有 255 十进制数的位“&”,我们为什么要这样做。我从 c
中的示例中找到了这个 const char *value =1234567890abcdefghijklm";
for(i=0; value[i]; i++) {
int r1 = isdigit(value[i]);
int r2 = isdigit(value[i]&0xFF);
printf("%d %d\n", r1,r2);
如果我输出上面的我看不出 r1 和 r2 之间的区别
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
2048 2048
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0
为什么要用 255(1 字节)来屏蔽这个值?
value[i]
的类型是 const char
,它的实现定义了 char 是有符号还是无符号,但是 isdigit()
技术上需要一个 (unsigned char)
所以你错过了演员表。 value[i] & 0xFF
的类型是 int
并且它需要演员表。 isdigit()
成功返回非零值,因此您打印出的实际值没有任何意义。
isdigit
的参数是 int
类型,并且必须等于 EOF
(通常为 -1)或在 unsigned char
的可表示范围内。
如果 plain
char
被签名,那么它可以包含负值,并且将 EOF
以外的负值传递给 isdigit
具有未定义的行为。这意味着将字符串的元素传递给 isdigit
是不安全的。
避免这个问题的通常方法是将参数转换为
unsigned char
:
int r2 = isdigit((unsigned char)value[i]);
事实上我建议这样做。
使用
0xff
进行按位运算可能具有相同的效果,尽管可能存在一些细微的差异,涉及整数提升和将按位运算应用于有符号类型(我懒得弄清楚)。
做a bitwise and with
0xff
的目的是为了避免在调用isdigit
时出现未定义的行为。但是转换为 unsigned char
有点干净。