How does arguments of a function call are evaluated?

Program logic goes into the function iff all the arguments are evaluated. However, the order of the evaluation is tad-bit ambigious.

This ambiguity presents itself when we’re using order dependent stuff in our function call arguments.

To display this, I am making use of prefix/postfix operators.

I remember seeing a SO answer which I didn’t bookmark so…..

void foo3(int first, int second, int third);
void foo2(int first, int second);
void foo1(int first);

are the functions we will using. foo? just prints out the arguments.

vector<int> v{1,2,3,4,5,6} is the main data element which we will play with.

Post-increment

int id = 0;
foo3(v[id++], v[id++], v[id++]);
foo2(v[id++], v[id++]);
foo1(v[id++]);

Running this yields:

IN FOO3
 First: 3	 Second: 2	 Third: 1
IN FOO2
 First: 5	 Second: 4	
IN FOO1
 First: 6	

Seems like the function arguments are evaluated in the reverse order. But, I wouldn’t bet on it.

Pre-increment

id = 0;
foo3(v[++id], v[++id], v[++id]);
foo2(v[++id], v[++id]);
foo1(v[++id]);

Running this yields:

IN FOO3
 First: 4	 Second: 3	 Third: 2
IN FOO2
 First: 6	 Second: 5	
IN FOO1
 First: 4113	

Just like in the previous case, function arguments are evaluated in the reverse order.

It seems like in F001 function call, we get a garbage value and not a SIGSEGV because of how the vector works. Vector reserves space for number of elements of powers of two.

Trivial but guilty

This is a trivial point but the author is guilty of wasting some good amount of time in debugging why the filterbank writing logic wasn’t working as intended. The author is guilty of using arrays and postfix operators as arguments to the relevant function.