c - 函数中整数和寄存器常量字符的解释
问题描述
char firstmatch(char *s1, char *s2) {
char *temp;
temp = s1;
do {
if (strchr(s2, *temp) != 0)
return temp;
temp++;
} while (*temp != 0);
return 0;
}
char *strchr(register const char *s, int c) {
do {
if (*s == c) {
return (char*)s;
}
} while (*s++);
return (0);
}
我是编程新手,我得到了这段代码,它可以在 string 中找到第一个s1
字符s2
。任务是理解 C 代码并将其转换为汇编代码。到目前为止,我的重点只是了解 C 代码在做什么,而我目前在使用指针时遇到了困难。我可以对函数上的代码进行排序,firstmatch()
然后往下走,但我对char * strchr()
函数有点困惑。我无法理解int c
关于常量字符指针的意义是什么?如果有人可以帮助解释它,我将不胜感激。
解决方案
代码示例中的函数strchr()
是标准 C 库函数的不完整实现,它定位 C 字符串中第一次出现的字符(如果有)。
由于历史原因,参数具有类型int
:在语言函数的早期版本中,只有在隐式类型int
不够时才会输入参数。字符参数作为值传递int
,因此不需要以不同方式键入参数。
该register
关键字已过时:早期的 C 编译器不如当前编译器先进,程序员可以通过使用register
关键字修饰其定义来帮助代码生成器确定将哪些变量存储在 CPU 寄存器中。现代编译器效率更高,通常在这个游戏中击败程序员,因此这个关键字现在大多被忽略。
但是请注意,此实现的行为与标准函数不同:c
必须char
在比较之前将 的值转换为。正如 chux 所指出的,<string.h>
出于比较目的,所有函数都将 C 字符串和内存块中的字节视为无符号字符。
这是具有正确行为的更具可读性的版本:
#include <string.h>
char *strchr(const char *str, int c) {
const unsigned char *s = (const unsigned char *)str;
do {
if (*s == (unsigned char)c) {
return (char *)s;
}
} while (*s++ != '\0');
return NULL;
}