Comment utiliser un index de tableau en tant qu’opérateur?

Comment utiliser un index de tableau en tant qu’opérateur?

Tel que:

#include main() { char sign[]={'+','-'}; int a, b; a = 12 sign[1] 10; printf("%d",a); } 

En réalité, ce code ne fonctionne pas. Quel sera le bon code pour ce type de programme?

Le plus simple consiste à utiliser une instruction switch ou une chaîne if-else.

 #include int main() { char sign[]={'+','-'}; int a,b; switch (sign[1]) { case '+': a = 12 + 10; break; case '-': a = 12 - 10; break; } printf("%d",a); } 

Si je faisais cela, je finirais probablement par transformer une partie de la logique en une fonction. Peut-être quelque chose comme ça:

 #include int perform_operation(char op, int lhs, int rhs) { switch (op) { case '+': return lhs + rhs; case '-': return lhs - rhs; default: return 0; } } int main() { char sign[]={'+','-'}; int a = perform_operation(sign[1], 12, 10); printf("%d",a); } 

Si vous n’êtes pas ssortingctement dépendant de la notation infixe, vous pourrez le faire simplement en

 int plus(int x, int y) { return x + y; } int minus(int x, int y) { return x + y; } int (*)(int, int) sign[]={plus, minus}; 

et vous pourrez l’utiliser comme:

 int a = sign[1](10, 12); 

Vous pouvez utiliser des pointeurs de fonction:

 //function: int addInt(int a, int b) { return a+b; } //define the pointer: int (*functionPtr)(int,int); main () { functionPtr sign[5]; sign[0] = &addInt; int a = 5, b = 8; //... int sum = sign[0](a,b); printf("%d", sum); return 0; } 

C’est un peu plus compliqué, et dans la plupart des cas simples, vous voudriez utiliser une instruction switch pour appeler différentes fonctions, mais c’est une méthode très utile pour traiter des cas plus grands et plus complexes.

Un exemple de cas où j’ai utilisé des tableaux de pointeurs de fonction comme celui-ci était lors du développement d’une application de traitement d’image, avec des fournisseurs fournissant les algorithmes pour certains traitements assez spéciaux.
Cependant, leur code était une propriété, et donc, bien que nous puissions obtenir des dll contenant des fonctions pouvant effectuer le traitement, nous ne pouvions pas l’intégrer à notre code. Comme un nombre quelconque de ces dll peuvent être nécessaires, et que nous souhaitions pouvoir append des fonctionnalités sans supprimer la compilation du système complet, nous devions être en mesure de les lire et de les gérer. Nous avons utilisé une méthode comme ci-dessus pour le faire.

Je serais tenté d’utiliser un ternaire pour cela:

a = 12 + (sign[1] == '-' ? -1 : +1) * 10;

Bien sûr, la valeur par défaut est + mais vous pouvez introduire des contrôles antérieurs pour vous protéger contre cela.

Vous pouvez utiliser ceci pour former une macro:

12 + SIGN(1) 10;

avec

#define SIGN(s) (sign[(s)] == '-' ? -1 : +1) *

qui reprend la forme de l’expression dans votre question à l’exception des crochets.