使用getchar_unlocked()读取输入

时间:2013-10-28 09:05:07

标签: c

我了解到使用getchar_unlocked是快速阅读输入的方法。我看过许多地方的代码,但无法理解。任何人都可以帮助我了解如何使用getchar_unlocked阅读? 提前致谢。

void scanint(int &x)
{
 register int c = getchar_unlocked();
 x = 0;
 for(;(c<48 || c>57);c = getchar_unlocked())
  ;
 for(;c>47 && c<58;c = getchar_unlocked()) 
 {
   x = (x<<1) + (x<<3) + c - 48;
 }
}

我也见过许多其他代码。我不太明白改变号码的目的。对此有任何帮助表示赞赏

3 个答案:

答案 0 :(得分:5)

getch_lock一次读取一个字符。在给定的代码中,我们试图读取一个整数。第一个for循环的目的是读取数字字符(如果存在)并忽略它。第二个for循环读取一个必须为数字并执行
的字符    n=n*10+c
由于C在Ascii中,我们减去了48,即'0'的Ascii代码。为了使代码更快而不是使用乘法移位 n*10=n*(8+2)=n*8+n*2=n<<3+n<<1

答案 1 :(得分:1)

getchar_unlocked()getchar()类似,不同之处在于它不检查多线程锁。

所以,它更快,但它不是线程安全的。

答案 2 :(得分:0)

我认为你可能对getchar_unlocked()的目的有错误的想法。真。

当从人类用户进行单字符I / O时,很难相信你需要专注于“快速”,因为人类会非常慢。

你包含的函数看起来像是使用getchar_fast()读取整数,并且以非常可怕的风格编写。它当然不像是任何特定解决方案的一部分。在处理x指针变量时,它也完全被打破了。

简而言之,您的问题不是很明确。