【发布时间】:2011-10-31 17:50:44
【问题描述】:
我是一名 python 程序员,正在从 K&R 书中学习 C。这似乎是一个非常微不足道的问题,但我仍然很难过。 下面附上一段来自 K&R(RIP Ritchie!)一书中实现 atoi() 函数的代码。
atoi(s) /*convert s to integer */
char s[];
{
int i, n, sign;
for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++)
; /* skip whitespace */
sign = 1;
if (s[i] == '+' || s[i] = '-') /* sign */
sign = (s[i++] == '+') ? 1 : -1;
for (n=0; s[i] >= '0' && s[i] <= '9'; i++)
n = 10 * n + s[i] - '0';
return (sign * n);
}
我的问题:
1) 第一个“for”循环除了计算有效字符的数量外,还有其他用途吗?
2) 如果 (1) 为真,第一个循环将 'i' 的值设置为有效字符数 - 第二个 for 循环如何在不将 i 重置为 0 的情况下工作?
例如,我输入“2992”作为函数的输入。第一个 for 循环将 i 设置为 3,那么函数的其余部分如何工作? 我可能把我的基础知识都搞砸了,但任何帮助都将不胜感激。谢谢,-克雷格
【问题讨论】:
-
我不知道 C 是那可怕的。
-
我认为理解一段代码最好的方法是用调试器(例如gdb)执行它,然后一步一步往前走。阅读代码和里面的 cmets 也可能会有所帮助。
-
@PatrickB.: 那是 非常古老的 C. 现代 C 看起来...完全一样 :) (除了现在更清晰的函数签名
int atoi(const char * s).) -
在 K&R 的第 2 版中,该函数具有更好(和更现代)的风格......请参见此处:codepad.org/U4hPr4Eg
-
@PatrickB。 C 是一个跨平台的汇编程序,仅此而已……按照今天的标准(除了其影响和使用的激进范围之外),它没有什么令人兴奋的。但不要将它与 C++11 之类的东西混为一谈,对于那些有耐心学习它的人来说,C++11 是一种深刻的范式转换野兽。