Pourquoi n'y a-t-il pas de littéraux courts dans 'C'?littéraux courts en C
Répondre
Cela n'a pas de sens d'avoir un littéral int court dans C puisque toutes les expressions entières sont évaluées comme si les sous-expressions avaient au moins la taille int.
Alternativement: Parce qu'ils ne sont pas nécessaires!
Les types de données de différentes tailles sont nécessaires pour bien s'intégrer au matériel sous-jacent et/ou pour économiser l'espace de stockage, mais les littéraux sont une construction de compilation qui est stockée dans les structures de données appropriées.
C'est différent avec float
par rapport à double
parce que le même nombre a réellement une représentation interne différente dans ceux - plus différents, de toute façon, que quelques zéros seulement.
De même, il y a une différence entre char
et short
même si elles peuvent être stockées dans les mêmes bits: Si le programmeur parle de données de caractère, il sera généralement plus commode pour lui de préciser, par exemple, 'A'
que 65
.
Mais un court 99
et un int 99
se ressemblent au programmeur, sont traités de la même manière dans le programme ... le type plus large fera facilement le travail des deux.
"il sera généralement plus pratique pour lui de spécifier, disons," A "que 65". Bien qu'en C, les littéraux de caractère ne sont pas réellement 'char', ils sont' int' aussi.Donc 'A' est une bonne manière portable d'exprimer "la valeur entière du caractère A dans le jeu de caractères de base", mais il n'interagit pas avec le système de type de la manière dont le questionneur veut vraisemblablement partir d'un littéral court. –
Si nous parlons original la conception du langage, rappelez-vous que C a obtenu la plupart de sa forme actuelle sur le processeur PDP-11, qui est de 16 bits. Ils avaient donc des entiers pour l'arithmétique et des caractères pour le stockage de chaînes. Les pointeurs étaient fondamentalement les mêmes que les entiers.
La langue était très pragmatique et seulement plus tard a obtenu une syntaxe plus formelle et plus complexe. Donc, la réponse est, il est juste arrivé à être de cette façon. Beaucoup plus tard, nous avons eu des processeurs 32 bits et 64 bits et la nécessité de distinguer entre les entiers de différentes longueurs. À ce jour, je code presque tous mes programmes C comme s'il n'y avait pas d'autre type que char et entier. Oh, au fait, "char" en C peut être signé et non signé selon la norme. Cela reflète que les caractères étaient destinés au stockage de caractères (chaînes de caractères) et à l'arithmétique.
Pour clarifier, (merci semaj) le compilateur peut choisir de traiter une variable déclarée "char" comme "unsigned char". Cela n'arrive pas pour un "int". Un "int" est toujours signé, mais avec les caractères vous ne pouvez pas être sûr. Vous devez supposer qu'un caractère peut avoir une arithmétique non signée ou signée. Il s'agit d'une optimisation de la vitesse pour gérer les processeurs qui fonctionnent plus rapidement avec l'une ou l'autre des implémentations. C'est à dire. l'accent est mis sur les caractères comme des conteneurs de stockage, pas comme un type arithmétique. (Son nom est aussi un cadeau, il aurait pu être appelé "court" ou "petit", mais a été appelé "char" pour une raison.)
J'ai peur que tu m'as perdu. En quoi le fait qu'un caractère puisse être signé ou non signifie-t-il qu'il était destiné au stockage de caractères lorsqu'un int peut également être signé ou non signé? – semaj
Réponse mise à jour. Merci. –
- 1. C# littéraux
- 2. Littéraux de chaîne C++?
- 3. Les littéraux de chaîne Unicode en C# vs C++/CLI
- 4. Les hachages littéraux dans C#?
- 5. Diviser un tableau dans des tableaux plus courts en C
- 6. Convertir des chemins courts (8.3) en longs?
- 7. règles Surcharger pour définies par l'utilisateur littéraux en C++ 0x
- 8. Littéraux d'objet JavaScript et littéraux de tableau
- 9. efficace googler noms courts
- 10. Littéraux définis par l'utilisateur (Littéraux étendus) de C++ 11 ... quels compilateurs le supportent?
- 11. Littéraux verbatim dans C++ managé? (comme C# 's @ "blah")
- 12. Comment windows résout les noms courts (8.3) en noms complets
- 13. Littéraux de chaînes
- 14. Exemples courts d'implémentation d'interprétation abstraite
- 15. Comment concaténer des littéraux regex en JavaScript?
- 16. Littéraux en langage de modèle django?
- 17. Fusionner deux littéraux objet en javascript
- 18. ANTLR: MismatchedTokenException littéraux similaires
- 19. visuel de base à cordes c littéraux et "\"
- 20. vraiment génial C# comportement du compilateur avec littéraux nullables
- 21. LINQ vers SQL vers XML (en utilisant des littéraux XML en C#)
- 22. Définition d'ints à des valeurs négatives en utilisant des littéraux hexadécimaux en C#
- 23. MySQL littéraux unicode
- 24. Verilog prend-il en charge l'évaluation des courts-circuits?
- 25. C# optimise-t-il la concaténation des littéraux de chaîne?
- 26. C++ vecteur littéraux, ou quelque chose comme eux
- 27. Comment inclure des littéraux extrêmement longs dans une source C++?
- 28. inférence argument template ++ C et littéraux de chaîne
- 29. littéraux dans les règles Mod_rewrite
- 30. Comment créer des extraits courts dans Vim?
voir http://stackoverflow.com/questions/1329163/ comment-écrire-un-non-signé-court-int-littéral –
Je l'avais regardé à l'avance. Merci pour le pointeur cependant. Il est mentionné que les littéraux courts ne peuvent pas être déclarés. Pourquoi n'est pas mentionné. Je me demandais s'il y avait une certaine motivation pour le concepteur de la langue de ne pas l'avoir et si oui, quel était-il. –
@Abhijith, vous devriez éditer votre question au lieu de la commenter. –