【发布时间】:2014-07-25 15:39:11
【问题描述】:
我正在研究更快的 I/O 方法来解决编程问题,
我发现了这种使用getchar_unlocked() 的方法(虽然有风险但仍然存在)。
我环顾四周,但不知道它是如何扫描整数值的
或者换句话说,这 4 行是什么意思以及它们在 scanint() 函数中的工作方式
定义如下
#include<iostream>
#include<cstdio>
#define gc getchar_unlocked
void scanint(int &x)
{
register int c = gc();
x = 0;
for(;(c<48 || c>57);c = gc());
for(;c>47 && c<58;c = gc())
{x = (x<<1) + (x<<3) + c - 48;}
}
int main()
{
int n,k;
scanint(n);
scanint(k);
int cnt=0;
while(n--)
{
int num;
scanint(num);
if(num%k==0)cnt++;
}
printf("%d",cnt);
return 0;
}
【问题讨论】:
-
这个程序的预期输入是什么?
-
它读取单个
char值直到找到非数字字符,并将数字添加到输出int参数。 -
代码扫描有符号整数,但对所有负值都失败。
-
很好奇,当代码可以使用
c<'0' || c>'9'并且更容易理解时,为什么还要使用c<48 || c>57? -
所使用的格式和约定总体上令人震惊