Has etiquetado tus preguntas C y C ++ al mismo tiempo, mientras que la respuesta es significativamente diferente en estos idiomas.
En primer lugar, la redacción del título de su pregunta es incorrecta (o, más precisamente, irrelevante para la pregunta en sí). En ambos ejemplos, la variable se declara y define simultáneamente, en una línea. La diferencia entre sus ejemplos es que en el primero las variables se dejan sin inicializar o inicializadas con un valor ficticio y luego se asignan a valor significativo más tarde. En el segundo ejemplo, las variables se inicializan de inmediato.
En segundo lugar, en lenguaje C ++, como @nightcracker señaló en su respuesta, estas dos construcciones son semánticamente diferentes. El primero se basa en la inicialización y el segundo en la asignación. En C ++, estas operaciones son sobrecargables y, por lo tanto, pueden dar lugar a resultados diferentes (aunque se puede observar que producir sobrecargas no equivalentes de inicialización y asignación no es una buena idea).
En el lenguaje C estándar original (C89 / 90) es ilegal declarar variables en la mitad del bloque, por lo que es posible que vea las variables declaradas sin inicializar (o inicializadas con valores ficticios) al comienzo del bloque y luego se le asignan valores significativos más adelante, cuando esos valores significativos estén disponibles.
En el lenguaje C99, está bien declarar variables en la mitad del bloque (como en C ++), lo que significa que el primer enfoque solo es necesario en algunas situaciones específicas cuando el inicializador no se conoce en el punto de declaración. (Esto también se aplica a C ++).