Best not to quote sigs (the lines including and after the "-- ").
for once it seemed all clear but things have started to get jumbled up
again.now wats exactly a tentative declaration ?? and how is int i =
3 ; an external declaration ??
First, you are confusing 'declaration' and 'definition'. I was
talking only about definitions and tentative definitions.
Second, 'int i = 2;' is an external definition of x because the
standard says it is. A declaration of a file-scope object with an
initializer constitutes an external definition (6.9.2 p1).
If a file-scope object is declared without an initializer and without
a storage class (or with storage class static) it is called a
tentative definition. E.g. both
int i;
static int j;
are tentative definitions. Why is this? The reason is to allow these
to co-exist with at most one declaration that *does* include an
initialiser. The standard wants to allow:
int x;
...
int x = 42;
(these can be in either order) and also to allow
int y;
on its own[1] with the meaning that y is defined and initialized to 0.
To do this, they introduce the idea of tentative definition. To have
simply said that 'int x;' is the same as 'int x = 0;' would have made
the example above illegal (since x would be defined twice).
[1] "on its own" means in a translation unit that may have multiple
tentative definitions of the same identifier but which has no external
definitions for it.