2010-09-10 4 views

Répondre

5

Voici une bonne discussion sur le three terms, and how they apply.

Le langage C utilise la notation infixe presque partout. Par exemple, vous feriez:

x = 4 + 2; 

Cependant, il y a quelques opérations qui utilisent la notation de préfixe, comme la négation:

x = -y; // "-" is using prefix notation 

Postfix est utilisé pour des opérations telles que (++ incrémentation):

x = y++; 
+0

Bon lien ... +1 –

5

Quelques exemples pour chacun:

infixes:

a + b 
a * b 

Postfix:

a++ 
f() 
a[i] 

Prefix (aussi appelé "unaire" en C et C++):

++a 
&a 
-a 
+0

Cet appel de fonction 'f()' est clairement un préfixe, vous ne pensez pas? L'opérateur 'f' est appliqué aux paramètres entre parenthèses. –

+0

ha! peut-être .. mais si 'f' est un jeton - c'est-à-dire défini par l'utilisateur - alors sûrement'() ', en tant que partie du langage, doit être l'opérateur agissant sur lui? –

+0

@Platinum c'est ce qu'on appelle une expression postfixe, car 'f' peut être une expression postfixe à son tour et l'opérateur'() 'la suit, ce qui rend tout le groupe de choses à gauche:' a [i]() '. Ce n'est pas une coupe claire cependant. En C99 '(int) {0}' est aussi une expression postfixe (littéral composé), mais il n'y a sûrement pas de "postfix" clair là-dedans :) –

1

La définition du langage C est pas tout à fait aussi nette sur les infix vs préfixe vs postfix; les termes "préfixe" et "infixe" n'apparaissent même pas dans la définition du langage en tant que telle. Au lieu de cela, vous avez des expressions d'opérateurs binaires (infixe de tri) et des expressions unaires (préfixe de tri). En outre, les regroupements d'expressions dans les catégories postfix, unaire et binaire ont plus à voir avec les expressions qui doivent avoir une priorité plus élevée que les autres, plutôt que là où les opérateurs apparaissent dans l'expression. Par exemple, les opérateurs && et || semblent devoir être regroupés avec les expressions d'opérateur binaire, mais ce n'est pas le cas; ils occupent leur propre espace dans la grammaire de la langue et ils ont leur propre sémantique unique. Les opérateurs de sélection de composants . et -> sont regroupés avec les opérateurs postfixes, même s'ils apparaissent entre deux expressions, car la sélection de composants doit toujours avoir une priorité plus élevée que, disons, l'adresse indirecte (&a.b doit toujours être analysée comme &(a.b), et non (&a).b) et aussi parce que l'opérande de droite doit toujours être un identificateur.

expressions Postfix sont les suivantes:

  1. expressions primaires (noms de variables, littéraux, parenthésée expressions)
  2. Tableau des expressions en indice (a[i])
  3. Sélection des composants (a->b, d.c)
  4. Fonction appels (foo(a,b))
  5. Exprimer des expressions d'incrémentation et de décrémentation (a++, b--)
  6. Compount littéraux (C99 seulement - (int []) {1, 2, 3})

Toutes les expressions de Postfix ont une priorité plus élevée que les expressions unaires ou binaires.

expressions unaires sont les suivantes:

  1. Postfix expressions
  2. expressions Cast ((int) foo)
  3. expressions sizeof (sizeof foo, sizeof (int))
  4. unaire (-5)
  5. unaire plus (+1)
  6. négation logique (!expr)
  7. négation Bitwise (~byte)
  8. expression d'adresse (&foo)
  9. expression Indirection (*ptr)
  10. incrément Pré et décrémentation (++foo, --bar)

expressions unaires ont une priorité supérieure à celle des expressions binaires, mais une priorité inférieure à celle des expressions postfixes.

expressions binaires sont les suivantes:

  1. expressions multiplicatif (a * b, c/d)
  2. expressions additif (a + b, c - d)
  3. expressions Shift (a << b, val >> 2)
  4. expressions relationnelles (a < b , c >= d)
  5. expressions égalité (a == b, c != d)
  6. expressions (a & b au niveau du bit, c | d, e^f)

expressions binaires ont une priorité plus faible que les deux postfix et expressions unaires.

En plus de ces groupes, vous avez également les expressions d'opérateur logique (&& et ||), les expressions conditionnelles (a ? b : c), qui ont une priorité plus faible que les expressions binaires, expressions d'affectation (a = b, c += d), expressions séquentielles (a, b, c), et des expressions constantes (int a[42], case 5:), qui sont différentes des littéraux classés avec des expressions postfixes.