C++ C++;:关于竞争性编程技巧的解释

C++ C++;:关于竞争性编程技巧的解释,c++,optimization,C++,Optimization,在用于竞争性编程的DMOJ online judge上,如果问题只需要读取无符号整数数据类型,则加快执行时间(C++)的技巧之一是将此宏添加到顶部 这是如何工作的,使用它的优点和缺点是什么 #define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x= (x<<3)+(x<<1)+_-'0');}while(0) char _; #define scan(x)do

在用于竞争性编程的DMOJ online judge上,如果问题只需要读取无符号整数数据类型,则加快执行时间(C++)的技巧之一是将此宏添加到顶部

这是如何工作的,使用它的优点和缺点是什么

#define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x= (x<<3)+(x<<1)+_-'0');}while(0)
char _;

#define scan(x)do{while((x=getchar())首先让我们重新格式化一下:

#define scan(dest) \
  do { \
    while((dest = getchar()) < '0'); \
    for(dest -= '0'; '0' <= (temp = getchar()); dest = (dest<<3) + (dest<<1) + temp - '0');
  } while(0)
char temp;
#定义扫描(dest)\
做{\
而((dest=getchar())<'0')\

对于(dest-=“0”;“0”,首先让我们重新格式化一下:

#define scan(dest) \
  do { \
    while((dest = getchar()) < '0'); \
    for(dest -= '0'; '0' <= (temp = getchar()); dest = (dest<<3) + (dest<<1) + temp - '0');
  } while(0)
char temp;
#定义扫描(dest)\
做{\
而((dest=getchar())<'0')\

对于(dest-='0';'0'来说,它的作用是通过一系列提前优化逐字符读取数字。有关更多详细信息,请参阅@MooseBoys'答案


关于它的优点和缺点,我看不出使用它有什么好处。像
(x这样的东西的作用是它通过一系列过早的优化逐字符读取数字。有关更多详细信息,请参阅@MooseBoys的答案


关于它的优点和缺点,我认为使用它没有任何好处(X你的好坏标准是什么?把宏展开看看。你知道它读的是无符号整数,所以想一想怎么读。它并不复杂。你的好坏标准是什么?把宏展开看看。你知道它读的是无符号整数,所以想一想怎么读。它不太复杂。答案不错。我认为f或者更高级的编程人员了解1会很有趣。为什么他们使用移位而不是乘法(猜测这是针对较旧处理器的代码优化的老习惯),和2。为什么这比scanf/cin好。@ZivS使用移位而不是乘法是非常糟糕的建议。当乘以常数时,编译器可以在有用的情况下进行转换(但如果没有,编译器将很难撤消该转换).回答很好。我认为对于更高级的编程人员来说,理解1是很有趣的。为什么他们使用移位而不是乘法(猜测这是针对较旧处理器的代码优化的老习惯),和2。为什么这比scanf/cin好。@ZivS使用移位而不是乘法是非常糟糕的建议。当乘以常数时,编译器可以在有用的情况下进行转换(但如果没有,则很难撤消)。