Le langage C (tout comme le C++) est historiquement un mélange de deux styles de programmation complètement différents, que l'on peut qualifier de "programmation par instructions" et de "programmation par expressions". Comme vous le savez, chaque langage procédural prend normalement en charge des constructions fondamentales telles que le séquençage et le branchement (voir Programmation structurée). Ces constructions fondamentales sont présentes dans les langages C/C++ sous deux formes : une pour la programmation par instructions, une autre pour la programmation par expressions.
Par exemple, lorsque vous écrivez votre programme en termes d'instructions, vous pouvez utiliser une séquence d'instructions séparées par ;
. Pour réaliser des branchements, vous utilisez des instructions if
. Vous pouvez également utiliser des boucles et d'autres types d'instructions de transfert de contrôle.
En programmation par expressions, les mêmes constructions sont également disponibles. C'est en fait là que l'opérateur ,
entre en jeu. L'opérateur ,
n'est rien d'autre qu'un séparateur d'expressions séquentielles en C, c'est-à-dire que l'opérateur ,
en programmation par expressions remplit le même rôle que ;
en programmation par instructions. Le branchement en programmation par expressions se fait à travers l'opérateur ?:
et, alternativement, à travers les propriétés d'évaluation en court-circuit des opérateurs &&
et ||
(la programmation par expressions n'a pas de boucles cependant. Et pour les remplacer par de la récursivité, il faudrait appliquer la programmation par instructions).
Par exemple, le code suivant
a = rand();
++a;
b = rand();
c = a + b / 2;
if (a < c - 5)
d = a;
else
d = b;
qui est un exemple de programmation par instructions traditionnelle, peut être réécrit en termes de programmation par expressions comme
a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? d = a : d = b;
ou comme
a = rand(), ++a, b = rand(), c = a + b / 2, d = a < c - 5 ? a : b;
ou
d = (a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? a : b);
ou
a = rand(), ++a, b = rand(), c = a + b / 2, (a < c - 5 && (d = a, 1)) || (d = b);
Bien entendu, en pratique, la programmation par instructions produit généralement un code C/C++ beaucoup plus lisible, donc nous utilisons normalement la programmation par expressions de manière très mesurée et restreinte. Mais dans de nombreux cas, elle est utile. Et la frontière entre ce qui est acceptable et ce qui ne l'est pas est en grande partie une question de préférence personnelle et de capacité à reconnaître et lire des idiomes établis.
À titre d'information supplémentaire : la conception même du langage est clairement adaptée aux instructions. Les instructions peuvent librement invoquer des expressions, mais les expressions ne peuvent pas invoquer des instructions (à part l'appel de fonctions prédéfinies). Cette situation est modifiée de manière assez intéressante dans le compilateur GCC, qui prend en charge les dites "expressions d'instructions" comme une extension (symétrique des "instructions d'expressions" dans le C standard). Les "expressions d'instructions" permettent à l'utilisateur d'insérer directement du code basé sur des instructions dans des expressions, tout comme ils peuvent insérer du code basé sur des expressions dans des instructions dans le C standard.
À titre d'information supplémentaire : dans le langage C++, la programmation basée sur les foncteurs joue un rôle important, qui peut être considéré comme une autre forme de "programmation par expressions". Selon les tendances actuelles en matière de conception C++, cela pourrait être préféré à la programmation par instructions traditionnelle dans de nombreuses situations.
21 votes
Je crois que toutes les "utilisations délicates" de l'opérateur virgule rendent le code moins lisible.
2 votes
Je suis d'accord. L'abus de la virgule rend votre code C beaucoup moins lisible.
0 votes
Voir aussi stackoverflow.com/questions/52550/…
10 votes
Comment une question avec 13 votes positifs et 4 favoris est-elle envisagée pour être fermée car ce n'est pas une question ?