“n=(n<;<;3)+;(n<;1)和#x2B;ch-x27;0';,ch=getchar_unlocked();`?

“n=(n<;<;3)+;(n<;1)和#x2B;ch-x27;0';,ch=getchar_unlocked();`?,c,performance,bit-manipulation,bit-shift,C,Performance,Bit Manipulation,Bit Shift,在codechef上的许多解决方案中,为了更快地输入输出,我遇到了这个表达式,但我无法理解它,因为我没有很多经验 inline int scan( ) { int n=0; int ch=getchar_unlocked(); while( ch <48 )ch=getchar_unlocked(); while( ch >47 ) n = (n<<3)+(n<<1) + ch-'0', ch=getchar_unlocked(); return

在codechef上的许多解决方案中,为了更快地输入输出,我遇到了这个表达式,但我无法理解它,因为我没有很多经验

inline int scan( ) {

int n=0;

int ch=getchar_unlocked();

while( ch <48 )ch=getchar_unlocked();

while( ch >47 )

n = (n<<3)+(n<<1) + ch-'0', ch=getchar_unlocked();

return n;

}
内联整数扫描(){
int n=0;
int ch=getchar_unlocked();
而(第47章)

n=(n
n
如果输入流由字符0-9组成,则代码块

while( ch >47 )
  n = (n<<3)+(n<<1) + ch-'0', ch=getchar_unlocked();
假设第二个字符是
5

  n = (n<<3)+(n<<1) + ch-'0' = 8
  n = (n<<3)+(n<<1) + ch-'0' = 85

n=(n逗号运算符分隔两个表达式。第一个表达式求值,然后丢弃,第二个表达式求值(可以使用此值)。逗号运算符的优先级低于赋值运算符,因此解释与其他表达式一样

n = (n<<3)+(n<<1) + ch-'0', ch=getchar_unlocked();

我本想写同样的答案,但后来我在这一行中发现了“,”。所以我不太确定这是一个语法错误吗?每个人都在回答这个小问题,这里的教训是不要使用codechef来找到好的代码。@callmecarrot--the“,”是一个逗号运算符。来自K&R:由逗号分隔的一对表达式从左到右求值,并丢弃左表达式的值。结果的类型和值是右操作数的类型和值。“基本上,他们使用逗号运算符来避免在while循环体周围放大括号。我必须同意OliverCharlesworth的观点,如果你在寻找好的代码,请避免codechef。你没有错过太多:)你应该只写
n*10
。编译器将为
n输出程序集=(这是一个基本上无用的优化;一个好的编译器会进行相同的转换(甚至更好的转换),如果它实际上对您所针对的机器有益的话。
  n = (n<<3)+(n<<1) + ch-'0' = 85
n = (n<<3)+(n<<1) + ch-'0', ch=getchar_unlocked();
for (count = 0, index = 1; index < MAX_INDEX; count += 1, index += 2) {
    /* some code */
}