If you had a lot more numbers to multiply or if multiplication was extremely expensive then there is one thing I can think of to do.
If you had a huge number of numbers to multiply then you could separate them into sub-sets and memoize the product of each set. When a particular set changes, due to one of its members changing, then the memoized product becomes invalid and needs to be recomputed. You could do this at several levels depending on how expensive multiplication is, how much memory you have available, and how often things change. How to best implement this in C probably depends on how the variables go about changing -- if an event comes in that says "here is a new value for C" then you can invalidate all products that had C in them (or check that old C actually is different from new C before invalidation). If they are volatile variables then you will probably just have to compare each of the current values to the previous values (and this will probably take as much or more time as just multiplying on any machine with a hardware multiply instruction).
So, if you have:
answer = A * B * C * D * E * F * G * H;
then you could do separate those out to:
answer = ( (A * B) * (C * D) ) * ( (E * F) * (G * H) );
Then, if rather than having this multiplication done directly in C you were to do it on an expression tree:
answer
*
/ \
/ \
/ \
ABCD EFGH
* *
/ \ / \
/ \ / \
AB CD EF GH
* * * *
/ \ / \ / \ / \
A B C D E F G H
Then at each level (well maybe just the top few levels) you could have a memoized sub-answer as well as some data to tell you if the variables below it had changed. If events come in to tell you to change a variable then that could cause the invalidation of the expression to propagate upward upon receipt of the event (or just recompute the memoized sub-answers for each event). If variables just magically change and you have to examine them to tell that they did change then you have more work to do.
Oh, another way to do this just popped in my head, and I'm ashamed that I didn't think of it earlier. If you do know the old and new values of a variable that has changed then, as long as the old value was not 0, you could just:
new_answer = (old_answer * new_var) / old_var;
In real math this would work, but in computer math this might lose too much precision for your purposes.