¿Cómo utilizar un índice de matriz como operador?

¿Cómo utilizar un índice de matriz como operador?

Tal que

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

En realidad este código no funciona. ¿Cuál será el código correcto para este tipo de progtwigs?

Lo más sencillo es utilizar una instrucción de conmutación o una cadena 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); } 

Sin embargo, si estuviera haciendo esto, probablemente terminaría moviendo parte de la lógica a una función. Quizás algo como esto:

 #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 no es estrictamente dependiente de la notación de infijo, podrá hacerlo simplemente por

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

y podrás usar eso como:

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

Podrías usar punteros de función:

 //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; } 

Es un poco más complicado y, en la mayoría de los casos simples, querría usar una instrucción switch para llamar a diferentes funciones, pero este es un método muy útil cuando se trata de casos más grandes y complejos.

Un ejemplo de cuando he usado matrices de punteros de función como esta fue cuando se desarrolló una aplicación de procesamiento de imágenes, con proveedores que proporcionan los algoritmos para un procesamiento bastante especial.
Sin embargo, su código era propietario y, si bien podemos alcanzar dlls que contienen funciones que podrían hacer el procesamiento, no pudimos incluirlo en nuestro código. Como es posible que se requiera cualquier número de estas dlls, y queríamos la capacidad de agregar y eliminar funciones sin volver a comstackr todo el sistema, necesitábamos poder leer las dlls y administrarlas. Utilizamos un método como el anterior para hacer esto.

Estaría tentado a usar un ternario para esto:

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

Por supuesto, este valor predeterminado es + pero podría introducir controles anteriores para protegerse contra eso.

Podrías usar esto para formar una macro:

12 + SIGN(1) 10;

con

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

que recupera la forma de la expresión en su pregunta exceptuando los corchetes.