Using getchar_unlocked()
Using getchar_unlocked()
我最近了解到使用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...
- 如何使用 SIGINT 在第二个线程中断 getchar
- 如果输入缓冲区不为空,请使用getchar.()检测Ctrl+d
- getchar() 避免转义序列
- getchar() 函数如何输出
- Python 3中是否有内置功能,例如C 中的GetChar()
- 6031:在Visual Studio 2019中忽略了返回值(getchar())
- 无法使我的getChar()函数能够工作,我希望它能正常工作,输出IS10而不是2 C
- 使用getchar()获取字符并将其保存到每次C 的新行中的文件中
- 如何在不按 Enter 的情况下传递 getchar() 以使其自动?
- 从文件而不是getchar中获取字符
- 需要澄清 getchar() 和换行符
- 从 getchar 读取输入
- 为什么getchar()会阻塞所有线程
- 用"fprintf"打印错误后调用"getchar()"有什么意义?
- 使用getchar()函数
- omxplayer中复杂的getchar()操作
- SFML 2.1 getchar equivalent
- 了解 Getchar 已解锁
- getchar 有什么问题(因为程序在没有检查的情况下退出循环)
- 使用 getchar() 输入字符的最有效方法,就像 cin 中没有换行符和空格字符一样C++