Using getchar_unlocked()

Using getchar_unlocked()

本文关键字:unlocked getchar Using      更新时间:2023-10-16

我最近了解到使用getchar_unlocked()是一种更快的读取输入的方法。 我在互联网上搜索并找到了下面的代码片段: 但我无法理解它。

void fast_scanf(int &number)
{
register int ch = getchar_unlocked();
number= 0;
while (ch > 47 && ch < 58) {
number = number * 10 + ch - 48;
ch     = getchar_unlocked();
}
}
int main(void)
{
int test_cases;fast_scanf(test_cases);
while (test_cases--) 
{
int n;
fast_scanf(n);
int array[n];
for (int i = 0; i < n; i++)
fast_scanf(array[i]);
}
return 0;
}

因此,此代码接受大小为n给定数量的test_cases的整数数组的输入。我不明白函数fast_scanf中的任何内容,比如为什么是这样一行:

while (ch > 47 && ch < 58) 
{ number = number * 10 + ch - 48;

为什么在声明CH时使用寄存器?

为什么getchar_unlocked((在函数中使用两次?等等。 如果有人为我详细说明这一点,那将有很大帮助。提前感谢!

好吧,既然你的要求需要解释清楚,我就写在这里......所以我不会在评论中把它全部混为一谈......

函数:(稍微编辑了一下,使其看起来更C++标准(

void fast_scanf(int &number)
{
auto ch = getchar_unlocked();
number= 0;
while (ch >= '0' && ch <= '9')
{
number = number * 10 + ch - '0';
ch     = getchar_unlocked();
}
}

在这里,首先通过查看 ASCII 表来考虑,因为如果您不这样做,您将无法理解结果是如何产生的......

1(在这里,您有一个字符ch它使用getchar_unlocked()从用户那里获取输入字符(auto 关键字会自动为您执行此操作,并且只能在C++中使用,而不是 C(...

2(您将变量分配给零,以便可以重用该变量,请注意,该变量是一个引用,因此它在程序内部也会更改...

3(while (ch >= '0' && ch <= '9')......如前所述,检查字符是否在数字 ASCII 限制内,类似于说字符必须大于或等于 48 但小于或等于 57...

4(在这里,事情有点棘手,变量乘以自身和10的乘积以及您存储的字符的实际整数值(...

5(在下一行中,ch被重新分配,这样你就不必永远留在循环中,因为如果用户不输入任何内容,ch将永远保持该数字......请记住,循环在到达末尾后会回到声明的位置,检查条件是否为真,如果为真则继续,否则会中断(...


例如:456764

在这里,ch 将首先取 4 然后其他人紧随其后,所以我们先用 4

...1(数字将分配给零。虽然循环检查给定的字符是否是数字,但如果继续,循环会中断它......

2(0 乘以 10 将为零...并将其与差值 52(即'4'(与 48(即'0'(相加,得到 4(实际数值,而不是字符'4'(...... 所以现在的变量数是 4...


其他人也是如此...看。。。

number = number * 10 + '5' - '0'

number = 4 * 10 + 53 - 48

number = 40 + 5

number = 45... etc, etc. for other numbers...