To be precise, there are 3 kinds of datasets that can be entered as input to 3dcalc:
(a) 1 sub-brick datasets (3D)
(b) multi-sub-brick datasets (4D)
(c) 1D files, which are treated as type (b) with every voxel in space getting the same value at each time point (i.e., the 1D coordinate of the 1D file is the time-axis)
If there are any datasets of type (b), then the datasets of type (a) are treated as if they are constant along the time axis. Thus, as Rick describes, multiplying a 3D dataset a[i,j,k] times a 4D dataset b[i,j,k,t] gives the result as a 4D dataset c[i,j,k,t]=a[i,j,k]*b[i,j,k,t].
If there are multiple datasets of type (b) input, they must all have the same size in the time-direction. (Otherwise, it isn't obvious what the "right" thing to do would be.) The first 4D dataset input is the "master" which determines the structure of the output (e.g., bucket vs. 3D+time). Of course, 3drefit can be used to patch things up afterwards.
A careful reading of the long and dense output of
3dcalc -help can be quite informative.
bob cox