这个C ++宏有什么作用(竞争性编程)?

时间:2018-08-01 05:22:32

标签: c++ macros

原文:

#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)

我尝试格式化它以更好地理解它。但是,有人可以解释它的工作原理和用途。

1 个答案:

答案 0 :(得分:4)

它从标准输入中读取字符并将其转换为整数。

此代码

 x = (x << 3) + (x << 1) + _ - '0';

等同于

 x = 10*x + (_ - '0');

这是完全虚假的优化,因为如果(x << 3) + (x << 1)的执行速度比10*x好,那么编译器将为您执行该转换。

该宏还依赖于已在某处声明的变量_。大概选择了该名称是为了避免与其他任何变量发生冲突。这是此宏可疑的另一个原因,它不是独立的。

其余部分相同。这是错误的编程方式。编写清晰易懂的代码,并依靠编译器进行此处正在执行的那种微优化。通常,编译器比程序员更擅长做这种事情。