Calling Convention :
In
this convention, there are mainly two important things to be mentioned.
1) The order
in which arguments are passed to function.
2) Whether the
called function or calling function should clean up the variable, when the
control returns from the function.
When
a function call is encountered, the actual arguments that are to be passed to
the function results in two possibilities
1) Arguments can
be passed from left to right
2) Arguments can
be passed from right to left
The
formal arguments and local variables that we declare in the functions are
created in stack memory. When the control returns from the function, the stack
is cleared. This is done either by the calling function or the called function,
and is decided by the Calling Convention. There are different calling
conventions are available to us. But the most used among them is Standard
Calling Convention. In this arguments are passed from right to left and
stack is cleared by the called function.
For example :
int
a=1, b=2, c=3;
printf(“%d %d %d ”, a , b , c);
In this call, it doesn’t matter
whether the arguments are passed from left to right or from right to left.
int
a=1; // a++ or ++a is also written as a = a + 1;
printf(“ %d %d %d”, a, ++a, a++);
In this
call, it matters about the passing of arguments. If the arguments are passed
from left to right, the output will be 1 2 2 . If the arguments are passed from
right to left, the output will be 3 3 1 .
Hence
by default, C’s calling convention is from right to left. That is First 1 is
passed to the a++ expression. As from the associativity table, we know that a++
is a postfix expression which has associativity left to right, a’s value is
passed to the function and then it is incremented. And for ++a expression, the
value becomes 3. Finally the latest value of a is 3 and is passed to the
function. Thus in right to left order, 1, 3, 3 gets passed. Once Printf()
function collects them, it prints the elements in the order we have written in
the function. Thus 3 3 1 are printed.
Note :
Whenever there is an expression,
Precedence and Associativity will come. In the above expressions, a++ has
highest precedence. The highest precedence expression values are passed first
and later next expression values are passed. So as coming from right to left,
the expressions are evaluated but the values are not passed.
int
a=1;
Printf(“%d
%d”, a++ , ++a);
In this case,
if we see from right to left, first ++a is evaluated and a becomes 2. But the
value is not passed to the function. For a++, first the value of a(2) is passed
to printf function and incremented. Now the incremented value is passed for ++a
to the printf function. The result will be 2 3.
Note :
If
an expression contains more than one operator, then precedence and
associativity of operators comes into action.
int
a = 1;
printf("%d
%d" , a++, a = ++a - a);
If we see
from right to left, in first expression contains combination of operators. The priority
order is ++, -, = . So the value becomes 0. This value is assigned to a in
a++ , then it is passed and incremented. Output will
be 0 1
Note :
For
printf() function, it accepts variable number of arguments even though if it
doesn’t matches in the format specifiers and variables listed in printf().
For example :
printf(“%d%d%d”, a, b);
printf(“%d%d”, a, b, c);
It doesn’t results in any compilation errors.
Programs for practice :
Assume a = 1
for every printf() statement.
1) printf("%d%d%d",a,a++,++a);
2) printf("%d%d%d",++a,a,a++);
3) printf("%d%d%d",++a,a++,a);
4) printf("%d%d%d",a++,++a,a);
5) printf("%d%d%d",a,a=--a/2,a++);
6) printf("%d%d%d",a+3,a--,++a*2);
7) printf("%d%d%d",2*a+4,a-a++,a);
For
solutions, Check yourself by compiling each statement.