Question: In C and C++, is there a fixed order for evaluation of parameter to the function? I mean, what do the standards say? Is it `left-to-right` or `right-to-left`?
I am getting confusing information from the books.

Is it necessary that `function call` should be implemented using `stack only`? What do the C and C++ standards say about this?

Answer: 
> 
> In C/C++ is there a fixed order for evaluation of parameter to the function. I mean what does standards says is it left-to-right or right-to-left . I am getting confusing information from the books.
> 
> 
> 

No, the order of evaluation of function parameters (and of two sub-expressions in any expression) is *unspecified behaviour* in C and C++. In plain English that means that the left-most parameter could be evaluated first, or it could be the right-most one, and *you cannot know which order that applies for a particular compiler*. 

Example:

```
static int x = 0;

int* func (int val)
{
  x = val;
  return &x;
}

void print (int val1, int val2)
{
  cout << val1 << " " << val2 << endl;
}

print(*func(1), *func(2));

```

This code is very bad. It relies of order of evaluation of print's parameters. It will print either "1 1" (right-to-left) or "2 2" (left-to-right) and *we cannot know which*. The only thing guaranteed by the standard is that both calls to func() are completed before the call to print().

The solution to this is to be aware that the order is unspecified, and write programs that don't rely on the order of evaluation. For example:

```
int val1 = *func(1);
int val2 = *func(2);
print(val1, val2); // Will always print "1 2" on any compiler.

```

---

> 
> Is it necessary that function call should be implemented using stack only. what does C/C++ standards says about this.
> 
> 
> 

This is known as "calling convention" and nothing that the standard specifies at all. How parameters (and return values) are passed, is entirely up to the implementation. They could be passed in CPU registers or on the stack, or in some other way. The caller could be the one responsible for pushing/popping parameters on the stack, or the function could be responsible.

The order of evaluation of function parameters is only somewhat associated with the calling convention, since the evaluation occurs *before* the function is called. But on the other hand, certain compilers can choose to put the right-most parameter in a CPU register and the rest of them on the stack, as one example.
As far as I know, the function `printf` has an exception here.

For an ordinary function `foo`, the order of evaluation of `foo(bar(x++), baz(++x))` is undefined. Correct! However `printf`, being an ellipsis function has a somewhat more definite order of evaluation.

The `printf` in the standard library, in fact, has no information about the number of arguments that has been sent to. It just tries to figure out the number of variables from the string placeholders; namely, from the number of percent operators (`%`) in the string. The C compiler starts pushing arguments from the very right towards left; and the address of the string is passed as a last argument. Having no exact information about the number of arguments, `printf` evaluates the last address (the string) and starts replacing the `%`'s (from left to right) with values of the corresponding addresses in the stack. That is, for a `printf` like below;

```
{
    int x = 0;
    printf("%d %d %f\n", foo(x), bar(x++), baz(++x));
}

```

The order of evaluation is:

1. x is incremented by 1,
2. function baz is called with `x = 1`; return value is pushed to the stack,
3. function bar is called with `x = 1`; return value is pushed to the stack,
4. x is incremented by 1,
5. function foo is called with `x = 2`; return value is pushed to the stack,
6. the string address is pushed to the stack.

Now, `printf` has no information about the number of arguments that has been sent to. Moreover, if `-Wall` is not issued in compilation, the compiler will not even complain about the inconsistent number of arguments. That is; the string may contain 3 `%`'s but the number of arguments in the `printf` line can be 1, 2, 3, 4, 5 or even can contain just the string itself without any arguments at all.

Say, the string has 3 placeholders and you've send 5 arguments (`printf("%d %f %s\n", k1, k2, k3, k4, k5)`). If compilation warning is turned off, the compiler will not complain about excessive number of arguments (or insufficient number of placeholders). Knowing the stack address, `printf` will;

1. treat the first integer width in the stack and print it as an integer (without knowing whether it is an integer or not),
2. treat the next double width in the stack and print it as a double (without knowing whether it is a double or not),
3. treat the next pointer width in the stack as a string address and will try to print the string at that address, until it finds a string terminator (provided, the address pointed to belong to that process; otherwise raises segmentation error).
4. and ignore the remaining arguments.