La compréhension d'un atoi() la fonction

Je suis un programmeur python arriver à apprendre le C de K&R livre. Cela va sembler terriblement question triviale, mais je suis perplexe quand même.
Ci-joint est un extrait de code de la K&R (RIP Ritchie!) livre qui met en œuvre la atoi() fonction.

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);
}

Mes questions:

1) la première "pour" boucle sert aucun but en plus de compter le nombre de validité characaters?

2) Si (1) est vrai, la première boucle définit la valeur de 'i' pour le nombre de caractères valides - comment est la seconde boucle de travailler sans réinitialisation de i à 0?

Dire par exemple je entrer "2992" comme une entrée de fonction. La première boucle fixe i à 3, alors, comment est le reste de la fonction de travail?
J'ai peut-être mes bases tout foiré, mais toute aide serait vraiment appréciée. Merci, -Craig

  • Je n'étais pas au courant que C est terrible.
  • Je pense que la meilleure façon de comprendre un morceau de code à exécuter avec un débogueur (e.g gdb), et aller de l'avant, étape par étape. Aussi la lecture du code et les commentaires à l'intérieur peut aider.
  • c'est très vieux C. Moderne C est beau... exactement la même chose 🙂 (sauf pour la signature de la fonction, qui est désormais beaucoup plus clair int atoi(const char * s).)
  • Dans la 2e édition de K&R, la fonction a un peu mieux (et plus moderne) de style ... voir ici: codepad.org/U4hPr4Eg
  • C est une croix-plate-forme de l'assembleur, et pas beaucoup plus...rien d'hallucinant par les normes d'aujourd'hui (autres que la portée radicale de son influence et de l'utilisation). Mais à ne pas confondre avec les goûts de C++11, qui est un profond changement radical de la bête pour ceux qui ont la patience pour apprendre.
InformationsquelleAutor Craig | 2011-10-31