65 votes

Pourquoi est argc un " int "(plutôt que d'un "unsigned int")?

Pourquoi les arguments de ligne de commande variable count (traditionnellement "argc") un 'int' la place d'un "unsigned int"? Est-il une raison technique?

J'ai toujours ignoré lorsque vous essayez débarrasser de toutes mes signé non signé comparaison des avertissements, mais jamais compris pourquoi c'est la façon dont il est.

56voto

mjv Points 38081

Le fait qu'à l'origine le langage C a été tels que, par défaut, toutes les variables ou argument a été définie comme étant de type int, est probablement un autre facteur. En d'autres termes, vous pourriez avoir:

  main(argc, char* argv[]);  /* see remark below... */

plutôt que de

int main(int argc, char *argv[]);

Edit: effectivement, comme Aaron, nous l'a rappelé, la syntaxe d'origine aurait été quelque chose comme

  main(argc, argv) char **argv {... }

Depuis les "prototypes" n'ont été introduits plus tard. Qui est venu à peu près après tout le monde avait enregistré un minimum de 10 heures à chasser subtile (et pas si subtile) liées à un type de bugs

33voto

DigitalRoss Points 80400

Quelques raisons:

  • parce qu'il n'a pas d'importance
  • parce que le C n'est pas à l'origine de l' unsigned mot-clé ou l' entier non signé types
  • parce que le C n'est pas à l'origine, vérifier les types de paramètre et n'ont même pas de prototypes.
    En conséquence, il est de pratique courante de même pas déclarer int types, comme c'était le défaut.
  • parce qu' int a été, en un sens, plus important. Tout était un int. C évolué en partie à partir d'une langue qui n'avait même pas types. Chaque varable était un word, ce qui est le int était à l'origine utilisé pour.

Mise à JOUR: Jason S demandé pour les sources. Je pense que vous pouvez creuser tout cela (sauf pour les "it doesn't matter") sur un papier par dmr qui est en ligne: Le Développement du Langage C. Vous pouvez avoir besoin de rechercher le plus tôt langues BCPL et B dans les endroits habituels.

12voto

John Bode Points 33046

Voici une histoire du langage de programmation C dans dmr propres mots. Il n'est pas dit explicitement (au moins à partir de la rapide écrémé, je lui ai donné), mais les plus anciennes versions de C n'a pas en charge les types non signés. mjv point sur typage implicite d' int est également important.

12voto

rlbond Points 24215

Parce que C est vieux, et il a été conçu de cette façon depuis le début. Il est trop tard pour changer maintenant.

8voto

Eli Bendersky Points 82298

Une autre raison pourrait être que les types non signés peuvent être gênant pour l'itération. Par exemple, cet extrait de l'itération vers le bas:

for (size_t i = SIZE - 1; i >= 0; --i)
  ...

Est, en effet, un bug. Quand j'ai atteint la valeur 0 dans la dernière itération, il ira droit dans 4294967295 (sur une machine 32 bits) et la boucle ne sera pas résilié.

Pour cette raison, personnellement, je trouve la plaine ints plus pratique pour l'itération. Vous n'avez pas à être particulièrement prudent lorsque vous basculez d'une for boucle de comptage jusqu'à compte à rebours lors de l'utilisation de services de renseignements.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X