IMO it is usefull to have the &quot;return result paradigm&quot;.
You can do things like: bar(foo(x, y)) and chain function results.
Notice how this applies to strcpy:<p><pre><code>  char *heap_ptr, *stack_ptr; ...    fn_needs_heap_ptr(strcpy(heap_ptr, stack_ptr));</code></pre>
Another example (dma address space != buf a.s):<p><pre><code>  char *dma_ptr, *buf; ... fn_needs_dma_ptr(strcpy(dma_ptr, buf)) ...
</code></pre>
IOW, foo(strcpy(dst, src)) is VERY different than strcpy(dst, src); foo(src);