“n=(n<;<;3)+;(n<;1)和#x2B;ch-x27;0';,ch=getchar_unlocked();`?
在codechef上的许多解决方案中,为了更快地输入输出,我遇到了这个表达式,但我无法理解它,因为我没有很多经验“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
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=(nn如果输入流由字符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 */
}