You can use expand.grid(A, B, C)
EDIT: an alternative to using do.call to achieve the second part, is the function mdply from the package plyr:
library(plyr)
d = expand.grid(x = A, y = B, z = C)
d = mdply(d, f)
To illustrate its usage using a trivial function ‘paste’, you can try
d = mdply(d, 'paste', sep = '+');