Kar*_*ath 31
<<
有点转移,(k<<3)+(k<<1)
是k*10
由一个人写的,虽然他比编译器更聪明(好吧,他错了......)
(*p) - '0'
0
从指向的字符中减去p
,有效地将字符转换为数字.
我希望你能弄清楚其余部分..只记得十进制系统是如何工作的.
请注意,这是一个符合标准的atoi
实现.很抱歉没有引用标准,但这样可以正常工作(来自:http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/)
该函数首先丢弃尽可能多的空白字符(如在isspace中),直到找到第一个非空白字符.然后,从该字符开始,采用可选的初始加号或减号,后跟尽可能多的基数为10的数字,并将它们解释为数值.
字符串可以包含在形成整数之后的其他字符,这些字符将被忽略并且对此函数的行为没有影响.
如果str中的第一个非空白字符序列不是有效的整数,或者由于str是空的或者只包含空格字符而不存在这样的序列,则不执行转换并返回零.
R..*_*R.. 28
k = (k << 3) + (k << 1);
Run Code Online (Sandbox Code Playgroud)
手段
k = k * 2³ + k * 2¹ = k * 8 + k * 2 = k * 10
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?
该*p - '0'
术语增加了下一个数字的值; 这个工作,因为C要求的数字字符有连续的值,这样'1' == '0' + 1
,'2' == '0' + 2
等
关于你的第二个问题(atof
),这应该是它自己的问题,而且它是论文的主题,而不是简单的回答......