Est-ce que C est fortement typé?

Pour citer Wikipedia :

Deux langages couramment utilisés qui prennent en charge de nombreux types de conversion implicite sont C et C ++, et il est parfois prétendu que ces langages sont faiblement typés. Cependant, d’autres soutiennent que ces langages imposent des ressortingctions suffisantes sur la façon dont les opérandes de différents types peuvent être mélangés, que les deux devraient être considérés comme des langages fortement typés.

Y a-t-il une réponse plus définitive?

“Fortement typé” et “faiblement typé” sont des termes sans signification technique largement acceptée. Les termes qui ont une signification bien définie sont

  • Un typage dynamic signifie que les types sont attachés aux valeurs au moment de l’exécution et qu’une tentative de mélange de valeurs de types différents peut provoquer une “erreur de type à l’exécution”. Par exemple, si dans Scheme vous essayez d’append un à true en écrivant (+ 1 #t) cela provoquera une erreur. Vous rencontrez l’erreur uniquement si vous essayez d’exécuter le code incriminé.

  • La saisie statique signifie que les types sont vérifiés au moment de la compilation et qu’un programme qui n’a pas de type statique est rejeté par le compilateur. Par exemple, si dans ML vous essayez d’append un à true en écrivant 1 + true , le programme sera rejeté avec un message d’erreur (probablement cryptique). Vous obtenez toujours l’erreur même si le code ne peut jamais être exécuté.

Différentes personnes préfèrent des systèmes différents, en partie en fonction de la valeur de leur flexibilité et de leur inquiétude quant aux erreurs d’exécution.

Parfois, “fortement typé” est utilisé pour signifier “typé statiquement”, et “faiblement typé” est utilisé incorrectement pour signifier “typé dynamicment”. Une meilleure utilisation du terme “fortement typé” est que “vous ne pouvez pas contourner ou subvertir le système de types”, alors que “faiblement typé” signifie “il existe des failles dans le système de caractères”. De manière perverse, la plupart des langages avec des systèmes de type statique ont des failles, tandis que de nombreux langages avec des systèmes de type dynamic ne présentent pas de lacunes.

Aucun de ces termes n’est lié en aucune façon au nombre de conversions implicites disponibles dans une langue.

Si vous voulez parler précisément des langages de programmation, il est préférable d’éviter les termes “fortement typé” et “faiblement typé”. Je dirais que C est un langage qui est typé statiquement mais qui a beaucoup de failles. Une lacune est que vous pouvez librement convertir n’importe quel type de pointeur en un autre type de pointeur. Vous pouvez également créer une faille entre deux types de votre choix en déclarant une union C comportant deux membres, un pour chacun des types en question.

J’ai écrit plus sur le typage statique et dynamic à pourquoi-interprété-langs-sont-principalement-ducktyped-while-comstackd-have-fort-typage .

Il est difficile de classer chaque langue en «faiblement» ou «fortement» typée – c’est plus un continuum. Mais, par rapport aux autres langues, C est assez fortement typé. Chaque object a un type à la compilation, et le compilateur vous indiquera (fort) si vous faites quelque chose avec un object que son type ne vous laisse pas faire. Par exemple, vous ne pouvez pas appeler des fonctions avec les mauvais types de parameters, accéder aux membres struct / union qui n’existent pas, etc.

Mais il y a quelques points faibles. Une des faiblesses majeures est la typographie – elles disent essentiellement que vous allez vous débrouiller avec les types d’objects, et que le compilateur doit être silencieux (quand c’est possible). void* est aussi une autre faiblesse – c’est un pointeur générique vers un type inconnu, et quand vous les utilisez, vous devez faire très attention à bien faire les choses. Le compilateur ne peut pas vérifier statiquement la plupart des utilisations de void* . void* peut aussi être converti en un pointeur vers n’importe quel type sans cast (uniquement en C, pas en C ++), ce qui est une autre faiblesse.

C est considéré comme faiblement typé, car vous pouvez convertir n’importe quel type en un autre type par le biais d’une dissortingbution, sans erreur de compilation. Vous pouvez en savoir plus sur le problème ici .

La littérature n’est pas claire à ce sujet. Je pense que fortement typé n’est pas oui / non, il existe différents degrés de fort typage.

Un langage de programmation spécifie comment il exécute les programmes. Parfois, il n’est pas clair comment exécuter certains programmes. Par exemple, les programmes qui tentent de soustraire une chaîne d’un nombre. Ou des programmes qui divisent par zéro. Il existe plusieurs manières de traiter ces conditions. Certaines langues ont des règles pour gérer ces erreurs (par exemple, elles lancent une exception). Les autres langues n’ont tout simplement pas de règles pour gérer ces situations. Ces langages ont généralement des systèmes de type pour empêcher la compilation de programmes conduisant à un comportement non spécifié. Et il existe également des langages qui ont un comportement non spécifié et qui n’ont pas de système de type pour empêcher ces erreurs au moment de la compilation (si vous écrivez un programme qui rencontre un comportement non spécifié, il peut lancer les missiles).

Alors:

Les langues qui spécifient ce qui se passe à l’exécution dans tous les cas (comme l’ajout d’un numéro à une chaîne) sont appelées de manière dynamic. Les langues qui empêchent l’exécution de programmes avec des erreurs au moment de la compilation sont typées statiquement. Les langages qui ne spécifient pas ce qui se passe et qui n’ont pas non plus de système de type pour empêcher les erreurs sont appelés faiblement typés.

Donc, Java est-il statiquement typé? Oui, car son système de type ne permet pas de soustraire une chaîne à un nombre. Non, car cela vous permet de diviser par zéro. Vous pouvez empêcher la division par zéro au moment de la compilation avec un système de type. Par exemple, en créant un type de nombre qui ne peut pas être nul (par exemple, NonZeroInt), et ne permet de diviser que par des nombres ayant ce type.

Donc, C est-il fortement typé ou faiblement typé? C est fortement typé car le système de types interdit certaines erreurs de type. Mais il est faiblement typé dans les autres cas où il n’est pas défini ce qui se passe (et le type de système ne vous protège pas).

C est plus fortement typé que Javascript et moins fortement typé qu’Ada.

Je dirais que cela tombe davantage dans le côté fortement typé du continuum. mais quelqu’un d’autre pourrait ne pas être d’accord (même si c’est faux).

Comment ça se passe pour définitif?

C est considéré comme étant statiquement typé (vous ne pouvez pas modifier une variable de int en flottant). Une fois qu’une variable est déclarée, elle est bloquée de cette manière.

Mais il est considéré comme faiblement typé car les types peuvent être retournés.

Qu’est-ce que 0? ‘\ 0’, FALSE, 0.0, etc.

dans beaucoup de langues, vous ne pouvez pas dire IF (variable) car les conditions ne prendront que des valeurs booléennes des expressions booléennes. Ceux-ci sont plus fortement typés. La même chose s’applique entre les caractères et les entiers.

fondamentalement c a deux principaux types de données simples, des entiers et des nombres à virgule flottante (bien que diverses précisions). Tout le rest, booléens, énumérations (pas simples mais ça va), etc. Même les caractères sont essentiellement des entiers.

Comparez à d’autres langages où il existe des types de chaînes, des types enum qui ne peuvent être affectés qu’aux valeurs définies, des types booléens où seules les expressions qui génèrent des booléens ou true / false peuvent être utilisées.

Mais vous pouvez dire que, comparé à Perl C, il est fortement typé. C’est donc un de ces arguments célèbres (vi vs emacs, linux vs windows, etc.). C # est plus fort que C. En gros, vous pouvez argumenter de toute façon. Et vos réponses iront probablement dans les deux sens 🙂 De plus, certains manuels / pages Web diront que C est faiblement typé, et certains diront que C est fortement typé. Si vous allez à Wikipedia, l’entrée C indique “typage partiellement faible”. Je dirais que par rapport à Python C est faiblement typé. Donc, Python / C #, C, Perl sur le continuum.

Beaucoup de bonnes réponses ici. Je veux évoquer un point important de Real World Haskell :

Il est utile de savoir que de nombreuses communautés linguistiques ont leurs propres définitions d’un «type fort». Néanmoins, nous parlerons brièvement et en termes généraux de la notion de force dans les systèmes de type.

(couper)

Les feux d’artifice autour des systèmes de caractères ont leurs racines dans l’anglais ordinaire, où les gens attachent des notions de valeur aux mots «faible» et «fort»: nous pensons généralement que la force vaut mieux que la faiblesse. Beaucoup plus de programmeurs parlent un anglais clair que le jargon académique et, très souvent, les universitaires lancent des briques à n’importe quel type de système. Le résultat est souvent ce passe-temps Internet populaire, une guerre des flammes.

Donc, regardez les réponses à propos de C et C ++, mais rappelez-vous que «fort» et «faible» ne correspondent pas à «bon» et «mauvais».

À mon avis, C / C ++ sont fortement typés. Le type de hacks permettant la conversion des types (void *) est dû à la proximité de C avec la machine. En d’autres termes, vous pouvez appeler des commandes d’assembleur à partir de Pascal et manipuler des pointeurs. Pascal est toujours considéré comme un langage fortement typé. Vous pouvez appeler les exécutables assembleur et C de Java à JNI mais cela ne rend pas Java faiblement typé.

C se contente de l’assembler avec des pointeurs bruts et autres.

Le terme fortement typé n’a pas de définition convenue. Par conséquent, à moins de définir ce que vous entendez par “fortement typé”, il est impossible de répondre à votre question.

D’après mon expérience, les termes «fortement typé» et «faiblement typé» sont utilisés exclusivement par les trolls, car leur absence de définitions permet aux trolls de les redéfinir en fonction de leur agenda. Mis à part le fait de lancer des warwars, ces termes sont à peu près inutiles.

Vous pourriez également vouloir jeter un coup d’œil sur Quels sont les aspects clés d’un langage fortement typé? ici sur StackOverflow.

Selon Dennis Ritchie ( créateur de C ) et Brian Kernighan, C n’est pas un langage fortement typé. Les lignes suivantes proviennent du livre Le langage de programmation C page 3 paragraphe 5

C n’est pas un langage fortement typé, mais au fur et à mesure de son évolution, sa vérification de type a été renforcée.

Il existe un continuum avec de multiples voies parallèles entre “faiblement typé” et “fortement typé”, deux termes qui ne sont même pas bien définis.

C est statiquement typé, car le compilateur sait quel est le type déclaré de chaque variable locale et membre struct.

Les langages typés dynamicment peuvent encore être fortement typés, si chaque object a un type spécifique, mais le compilateur n’a aucun moyen de connaître ce type.

c est faiblement typé, b est sans typage.

Quelle est la raison de votre requête? La raison pour laquelle je pose cette question est qu’il s’agit en quelque sorte d’une différence mineure et que votre utilisation particulière de «fortement typé» pourrait nécessiter plus ou moins de clarification. Je dirais certainement que Java et les autres langages ont des ressortingctions plus ssortingctes sur la conversation de type implicite.

Il est difficile de fournir une réponse concrète lorsqu’il n’y a pas de définition concrète de “fortement typé”. Je dirais que C est fortement typé dans la mesure où chaque variable et chaque expression a un type mais est faiblement typé en ce sens qu’il permet de changer de type en utilisant des moulages et de réinterpréter la représentation d’un type en un autre.

Je dirais que C est aussi fortement typé que le dicte votre compilateur / plateforme. Par exemple, si vous construisez sur une plate-forme ssortingcte, le déréférencement d’un pointeur de type puni va probablement se briser:

 void m_free(void **p) { if (*p != NULL) { free(*p); *p = NULL; } } .... char *str = strdup("foo"); m_free((void **) &foo); 

Maintenant, si vous aviez demandé au compilateur de sauter un aliasing ssortingct, ce serait un problème, mais pas très portable. Donc, en ce sens, repousser les limites du langage est possible mais probablement pas la meilleure idée. Cela va au-delà du casting typique, c’est-à-dire que le casting est aussi long et montre vraiment l’un des pièges possibles du vide.

Donc, je dirais que C est fondamentalement ssortingctement typé, mais ses différents compilateurs supposent que le programmeur connaît mieux et permet une certaine flexibilité. Cela dépend vraiment du compilateur, certains ne déceleraient pas ce problème potentiel. Donc, en ce sens, le compilateur de choix joue vraiment un rôle lorsque vous répondez à la question. Ce qui est correct diffère souvent de ce que votre compilateur vous permettra de faire.

Pas fortement typé.

Considérez ce que le prototype de fonction suivant vous indique sur les types de données des arguments:

 void func (int n, char ch, ...); 

Rien. Je suggère donc que le typage fort ne s’applique pas ici.

Je dirais que c’est fortement typé car chaque expression a un type qui n’est pas fonction de sa valeur; ei il peut être connu avant l’exécution.

OTOH Je ne suis pas sûr que ce soit la description correcte de fortement typé. La seule affirmation plus forte que je puisse trouver est que vous ne pouvez pas corrompre le système de types lors de l’exécution via des interprétations de type réinterprétées, des unions, des appels dans d’autres langages, des pointeurs, un langage d’assemblage, etc. existent mais sont tellement paralysées qu’elles ne semblent pas intéresser beaucoup les programmeurs en dehors de la haute assurance et du monde universitaire. Comme l’a souligné quelqu’un, pour bien faire les choses, vous devez avoir des types comme nonZeroInt et autres. Beurk.