Syntaxe et sémantique des fonctions en langage C - réponses

Instructions pour le QCM :
Pour chacune des questions, plusieurs réponses peuvent être correctes, vous pouvez donc cocher plusieurs cases !

  1. Une fonction en langage C 89 est définie par :
  2. FAUX : son nom et le type de valeur retournée. ( Bien que l'édition de liens n'utilise que le nom pour trouver la fonction, le type de retour ainsi que les types des arguments sont nécessaires pour la cohérence entre les arguments passés et l'utilisation de la valeur retournée. )
    FAUX : son nom seul. ( Bien que l'édition de liens n'utilise que le nom pour trouver la fonction, le type de retour ainsi que les types des arguments sont nécessaires pour la cohérence entre les arguments passés et l'utilisation de la valeur retournée. )
    VRAI : le type de retour, le nom, le nombre et les types d'arguments formels de la fonction. ( En langage C, les arguments font partie du prototype. Il n'existe cependant pas de possibilité d'avoir deux fonctions qui portent le même nom et qui ont des paramètres différents en nombre ou en type. )

  3. Le langage C réalise-t-il le passage d'arguments par valeur ou par adresse ?
  4. FAUX : Par valeur pour les constantes et par adresse pour les variables. ( Il n'y a pas de différence de traitement entre les variables et les constantes. )
    VRAI : Par adresse pour les pointeurs et les tableaux, par valeur pour les variables et les constantes. ( Il n'y a pas de différence de traitement entre les adresses et les autres types. L'ensemble des paramètres est passé par copie de la valeur du paramètre dans une variable. Ainsi, une constante entière devient une variable entière et une adresse d'entier (constante du type adresse d'entier) devient un pointeur d'entier. )
    FAUX : Par valeur quel que soit le type d'arguments à la fonction appelée. ( Non les tableaux et les pointeurs sont passés par adresse. )

  5. En langage C, le retour de fonction :
  6. VRAI : Doit être d'un type cohérent avec le type du retour de la fonction ( Oui sinon il faut réaliser un 'cast'. )
    VRAI : Ne peut retourner qu'un résultat à la fois ( Oui, même s'il y a plusieurs appels à 'return' dans le code de la fonction, un seul d'entre eux est appelé et il ne tranportera qu'une seule valeur. )
    VRAI : Peut retourner une structure ( Oui, c'est la seule solution pour retourner plusieurs valeurs calculées par une fonction. )
    FAUX : Peut retourner le contenu d'un tableau . ( Non, une fonction ne peut pas retourner le contenu d'un tableau, à moins d'intégrer ce contenu dans une structure. )

  7. Une fonction qui retourne un pointeur peut :
  8. FAUX : Retourner un pointeur sur n'importe quelle variable locale. ( Non, la variable locale doit être rémanente pour pouvoir être utilisée lorsque le fonction est terminée (ajouter 'static' sur la ligne de définition). )
    VRAI : Retourner un pointeur sur une zone mémoire correspondant aux variables globales. ( Oui, c'est sans danger. )
    VRAI : Retourner un pointeur sur une zone mémoire allouée dynamiquement ( Oui, c'est un peu dangereux car il est facile de déborder de cette zone. )

  9. Les types suivants existent en langage C 89 :
  10. VRAI : caractère ( Le type caractère est appelé 'char'. Il correspond à un type entier exprimé sur huit bits. )
    VRAI : entier ( Il existe plusieurs types entier, appelés 'short', 'int' et 'long'. Leurs tailles sont exprimées selon la relation suivante : sizeof(short) <= sizef(int) <= sizeof(long). )
    VRAI : virgule flottante ( Il existe plusieurs types permettant de réaliser des opérations en virgule flottante : 'float', 'double' et 'long double'. )
    FAUX : booléen ( Le type 'booléen' n'existe pas en langage C 89. )

  11. L'opérateur d'affectation en langage est un opérateur sans statut particulier. Il est ainsi possible de réutiliser la constante fournie par une affectation. Par exemple, 'a = b = c = 1;' affecte la valeur 1 aux variables c, b et a.
  12. FAUX : Non, l'opérateur d'affectation est un opérateur spécialisé. ( Contrairement à ses prédécesseurs, le langage C n'attribue pas de statut particulier à cet opérateur. )
    VRAI : Oui, l'opérateur d'affectation est un opérateur banalisé. ( Contrairement à ses prédécesseurs, le langage C n'attribue pas de statut particulier à cet opérateur. )

  13. En langage C, l'instruction composée est réalisée à partir d'instructions groupées dans un bloc entre deux accolades.
  14. VRAI : Oui ( En effet, une instruction en langage C peut être une instruction simple ou un bloc d'instructions. )
    FAUX : Non ( En effet, une instruction en langage C peut être une instruction simple ou un bloc d'instructions. )

  15. Une instruction simple est toujours terminée par un point virgule.
  16. VRAI : Oui ( En effet, c'est une expression terminée par un ';'. )
    FAUX : Non ( Si, une instruction simple est une expression terminée par un ';'. )

  17. En langage C, les instructions de contrôle permettant de faire des choix sont les suivantes :
  18. VRAI :
    if (expression) instruction else instruction
    
    où la partie else est facultative. ( C'est exactement la bonne forme. Les parenthèses autour de l'expression sont obligatoires. L'instruction est définie comme nous l'avons vu dans la question précédente, c'est-à-dire soit une instruction simple soit un bloc d'instructions. )
    FAUX :
    if expression then instruction else instruction
    
    ( Les parenthèses autour de l'expression sont obligatoires et il n'y a pas de then. C'est en 'shell-script' qu'il y a un 'then'. )
    VRAI :
    switch (expression) {
     case const1 : 
           instructions
    ...
     case constn :
           instructions
    } 
    
    ( Les tables de sauts sont structurées comme des ensembles d'instruction avec des points d'entrée caractérisés par des valeurs de constantes entières. )
    FAUX :
    case expression in 
      const1 : 
           instructions
    ...
     constn :
           instructions
    esac
    
    ( Cette syntaxe correspond encore à du shell-script. )

  19. En langage C, les instructions de contrôle permettant de faire des boucles sont les suivantes :
  20. FAUX :
    for (instruction; instruction; instruction) instruction
    
    ( Non, sinon il serait possible de mettre des blocs d'instructions entre les parenthèses. )
    VRAI :
    for (expression;expression;expression) instruction
    
    ( C'est exactement la bonne forme. La première expression est une expression d'initialisation, la seconde expression correspond à la condition de passage dans la boucle et la dernière expression est le plus souvent utilisée pour faire évoluer la boucle. )
    VRAI :
    while (expression) instruction
    
    ( C'est la bonne forme. L'expression correspond à la condition de passage dans la boucle. )
    VRAI :
    do instruction while (expression) 
    
    ( C'est la bonne forme. L'expression correspond à la condition de passage dans la boucle. Cette forme de boucle garantit que l'instruction est réalisée au moins une fois. )