34 votes

Pourquoi puis-je utiliser des constantes comme déclarations en C?

Pourquoi ce programme ci-dessous ne montre aucune erreur?

 int main (void) {
    "ANGUS";
    1;
    3.14;
    return 0;
}
 

27voto

Lars Viklund Points 571

Chacun de ces états sont des expressions qui correspondent à une valeur, qui est ensuite défaussée. Le comparer à si vous appelez une fonction qui a renvoyé un int, un char ou un flotteur, sans l'aide de la valeur de retour. C'est aussi une expression qui renvoie une valeur.

Il n'est pas rare d'avoir des fonctions qui renvoient des valeurs que l'appelant peut ou peut ne pas être intéressé par comme, par exemple, où l' printf("%d", 9001) renvoie le nombre de caractères imprimés. Un appelant peut utiliser le nombre retourné, ou ils peuvent simplement l'ignorer.

Si le compilateur se plaint à chaque fois que vous avez ignoré une valeur de retour, vous aurez un très très bruyant journal de génération. Certains compilateurs cependant diagnostiquer (si un nombre suffisant de signaux d'alarme sont activés) tels inutile effets secondaires moins utilise des constantes et des variables.

16voto

paxdiablo Points 341644

Il est parfaitement valable pour une instruction C juste une valeur qui est rejeté. La plupart des gens ne se rendent pas compte que c'est exactement ce qui se passe quand on code en place des choses comme:

x++;
printf ("Hello, world\n");

L'ancien est en fait une expression qui arrive juste pour avoir les effets secondaires de l'incrémentation de la variable après "le retour" à elle.

Le dernier appel de la fonction renvoie en fait une valeur (le nombre de caractères imprimés) qui est également ignoré.

À partir d'un certain point de vue, qui n'est pas différent de ces déclarations:

42;
3 * 12;

autre que le fait qu'ils n'ont pas d'effets secondaires qui les rendent utiles.

En fait, même x = 1 est une expression dont le résultat est ignoré. C'est ce qui rend x = y = z = 0 possible, car c'est effectivement:

(x = (y = (z = 1)));

Tout cela est détaillé dans C99, section 6.8.3 Expression and null statements qui dit, en partie:

L'expression dans une expression instruction est évalué comme un vide, l'expression de son côté effets, tels que les affectations et les appels de fonction qui ont des effets secondaires.

9voto

David Heffernan Points 292687

Il est parfaitement valable qu’une déclaration ne soit constituée que d’une expression. Cela ne donne rien dans vos exemples, mais il est tout à fait valable.

5voto

amod0017 Points 1172

Comme c est une déclaration valide, mais lorsque vous utilisez Java, vous obtiendrez une erreur de compilation.

4voto

Ulrich Dangel Points 2206

Pourquoi devrait-il? Les trois premières lignes de votre main ne font rien et renvoient 0; est une expression valide.

Si vous utilisez gcc pour compiler le programme, essayez d'activer tous les avertissements (avec le paramètre -Wall). Cela afficherait warning: statement with no effect [-Wunused-value]

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