演算子の優先順位も考慮してみた
#include <stdio.h>

static double add(double a, double b) {
 return a + b;
}
static double sub(double a, double b) {
 return a - b;
}
static double mul(double a, double b) {
 return a * b;
}
static double div(double a, double b) {
 return a / b;
}
int main() {
 int i;
 double (* op[])(double, double) = {add, sub, mul, div};
 char str[] = "+-*/";
 double d[16], a = 2.0, b = 3.0, c = 5.0;

 for(i = 0; i < 16; ++i)
  if ( i/4 < 2 && i%4 > 1 )
   d[i] = op[i/4](a, op[i%4](b, c));
  else
   d[i] = op[i%4](op[i/4](a,b),c);

 for( i = 0; i < 16; i++ )
  printf( "%f %c %f %c %f = %f\n", a, str[i/4], b, str[i%4], c, d[i] );
 return 0;
}