28 votes

Pourquoi dois-C langues nécessitent des parenthèses autour d'un simple état dans une instruction if?

Il semble stupide, mais au fil des années, je n'ai pas été en mesure de venir avec un cas d'utilisation qui exigent que le présent. Une rapide recherche sur google n'a pas révélé quelque chose de valable.

De mémoire il y avait un cas d'utilisation mentionnées par Bjarne Stroustrup, mais je ne peux pas trouver une référence à elle.

Alors, pourquoi ne pouvez-vous pas cela C langues:

int val = 0;
if val
  doSomehing();
else
  doSomehinglse();

Je peux accepter le "nous ne pouvions pas être dérangé ajoutant la prise en charge de lexer" la raison, je veux juste savoir si cette syntaxe pauses d'autres constructions de langage. Considérant le nombre de dément syntaxe caractéristiques, il sont en C/C++, je ne crois pas que cela aurait ajouté beaucoup de complexité.

49voto

Tamas Czinege Points 49277

Si il n'y a pas de crochets autour des expressions en if des constructions, quel serait le sens de l'affirmation suivante?

if x * x * b = NULL;

Est-il

if (x*x)
    (*b) = NULL;

ou est-il

if (x)
    (*x) * b = NULL;

(bien sûr, ce sont stupides exemples et n'ont même pas de travail pour des raisons évidentes, mais vous obtenez le point)

TLDR: les Crochets sont nécessaires en C pour supprimer la possibilité même de toute ambiguïté syntaxique.

12voto

wheaties Points 20917

Dites-moi comment interprit suivantes:

if x ++ b;

Semble stupide, mais...

if( x ) ++b;

ou

if( x++ ) b;

ou peut-être "x" a un opérateur surchargé alors...

if( x ++ b){;}

Edit:

Comme Martin York, a noté "++" a une priorité plus forte raison pour laquelle j'ai dû ajouter de la surcharge d'opérateur friandise. Il a tout à fait raison lorsque vous traitez avec les compilateurs modernes jusqu'à ce que vous permettez à tout ce qui surcharge la bonté qui vient avec le C++.

4voto

Rex M Points 80372

Je pense qu'une meilleure question serait: "pourquoi voulons-nous une telle chose?" qu'au "pourquoi n'avons-nous pas cela?". Il introduit une autre, sinon inutile de cas de bord dans l'analyseur lexical, de sorte que vous pouvez éviter de taper les 4 caractères supplémentaires; et ajoute à la complexité de la spécification en autorisant des exceptions à une syntaxe simple qui prend déjà en charge de tous les cas possibles à l'amende juste. Pour ne pas mentionner les orteils de la ligne de l'ambiguïté, qui dans un langage de programmation n'a pas beaucoup de valeur.

1voto

Michael Stum Points 72046

Une autre chose à garder à l'esprit: C a été créé à une époque où de stockage sur bande était commun, de manière aléatoire, chercher ou va vers l'arrière dans le fichier en cours ou même d'autres fichiers n'était pas possible (ce qui explique aussi pourquoi vous devez mettre certains trucs (c'est à dire avant les déclarations) avant que d'autres choses (c'est à dire l'utilisation de fonctions), même si le compilateur doit être en mesure de le comprendre lui-même).

0voto

Michael Buen Points 20453

j'aimerais que la syntaxe trop, mais pour éviter d'analyse ambiguties, doit être de cette forme:

pour plusieurs instructions:

if val 
{ 
    doSomething();
    doOthers();
}

pour une déclaration:

if val: 
   doSomething();

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