原文:
#define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar());
x=(x<<3)+(x<<1)+_-'0');}while(0)
展开:
do {
while ((x = getchar()) < '0');
for (x -= '0'; '0' <= (_ = getchar());
x = (x << 3) + (x << 1) + _ - '0');
} while (0)
我尝试格式化它以更好地理解它。但是,有人可以解释它的工作原理和用途。
答案 0 :(得分:4)
它从标准输入中读取字符并将其转换为整数。
此代码
x = (x << 3) + (x << 1) + _ - '0';
等同于
x = 10*x + (_ - '0');
这是完全虚假的优化,因为如果(x << 3) + (x << 1)
的执行速度比10*x
好,那么编译器将为您执行该转换。
该宏还依赖于已在某处声明的变量_
。大概选择了该名称是为了避免与其他任何变量发生冲突。这是此宏可疑的另一个原因,它不是独立的。
其余部分相同。这是错误的编程方式。编写清晰易懂的代码,并依靠编译器进行此处正在执行的那种微优化。通常,编译器比程序员更擅长做这种事情。