C++ 从C+理解代码+;程序
我试图从一个编码网站解决方案中理解一个代码,但无法理解很多事情。我能理解BIT和fenwick部分,但不管我不能理解什么,我都写在下面:C++ 从C+理解代码+;程序,c++,C++,我试图从一个编码网站解决方案中理解一个代码,但无法理解很多事情。我能理解BIT和fenwick部分,但不管我不能理解什么,我都写在下面:这段代码的源代码是 如果有人解释一下为什么我们倾向于使用这些函数而不是使用标准定义的输入输出函数的概念,这将非常有帮助: char ioSpace[500000 * 17 + 128]; unsigned popcnt(unsigned x) { #ifndef ONLINE_JUDGE return __builtin_popcount(x);
这段代码的源代码是
如果有人解释一下为什么我们倾向于使用这些函数而不是使用标准定义的输入输出函数的概念,这将非常有帮助:
char ioSpace[500000 * 17 + 128];
unsigned popcnt(unsigned x)
{
#ifndef ONLINE_JUDGE
return __builtin_popcount(x);
#else
unsigned ret;
asm("popcntl %1, %0;":"=r"(ret) :"r"(x));
return ret;
#endif
}
unsigned readUInt(char*& readPos)
{
unsigned num = 0;
unsigned c;
while ((c = *readPos++) >= '0')
num = num * 10 + (c - '0');
return num;
}
template<unsigned D>
void writeDigit(char*& writePos, unsigned& advance, unsigned& num)
{
unsigned digit = num / D;
num %= D;
if (digit)
advance = 1;
*writePos = digit + '0';
writePos += advance;
}
void writeUInt(char*& writePos, unsigned num)
{
unsigned advance = 0;
writeDigit<100000>(writePos, advance, num);
writeDigit<10000>(writePos, advance, num);
writeDigit<1000>(writePos, advance, num);
writeDigit<100>(writePos, advance, num);
writeDigit<10>(writePos, advance, num);
advance = 1; // for zero number
writeDigit<1>(writePos, advance, num);
*writePos++ = '\n';
}
有人可以解释我的整个过程,因为我一直试图把这些风格融入到C++编程中,因为缺乏理解,不可避免地失败了。p> 嗯。。。我非常确定readUInt函数用于将字符串数字转换为实际数字,即等效于atoi()函数。我认为WriteDigit与此相反,但我不确定。首先,我看不到任何证据表明此代码是值得您研究的好示例。完全没有任何注释本身使我不信任代码。如果您真的想理解这段代码,请在调试器中逐步完成它,它应该变得清晰,您不会说您在哪里被这段代码卡住了。为了让你开始,请阅读一些关于阅读的观察 很明显readUint()和writeUint()方法是针对缓冲区工作的,可能是ioSpace,尽管您没有显示实际调用,所以我们不能确定,但是您的
read(STDIN_FILENO, ioSpace, sizeof(ioSpace));
显示从STDIN获取iospace的日期。如果文件比iospace大,会发生什么情况,从您显示的内容来看还不清楚。错误处理也是如此
readUint()的代码如下:
它获取下一个字符,并增加readPosition。当我们看到这一点时,我们应该立即考虑何时停止。在这种情况下,当字符c不是
>= '0'
换句话说,当我们看到的字符小于ascii“0”时,可以是任何字符,如“&”或“#”,但作者可能期望换行“\n”,因为这似乎是他们在writeUint()中终止数字的原因-明白我关于缺少注释的意思吗?然后
c - '0'
产生字符“9”的数值-“0”是9的ascii码减去0的ascii码,57-48,当然是9
while ((c = *readPos++) >= '0')
num = num * 10 + (c - '0');
然后,我们通过乘以10并添加最近读取的值来构建十进制值
现在,此代码易受包含字母的文件的攻击。看看如果你有这样一句话会发生什么
23A4\n
因此,如果使用此代码,您需要有一些理由相信您的输入
写作只是通过调用WordEdIt()函数从数字中获取单个数字。
我认为自己是一个相当胜任的程序员(毕竟,我做了一些编程工作已经超过30年了)。我完全不知道这段代码要解决什么问题。这也许是解决某些问题的完美办法,但我对此表示怀疑。while ((c = *readPos++) >= '0')
num = num * 10 + (c - '0');
23A4\n