Ha etiquetado su pregunta C y C ++ al mismo tiempo, mientras que la respuesta es significativamente diferente en estos lenguajes.
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 se inicializan con un valor ficticio y luego se le asigna un valor significativo más adelante. En el segundo ejemplo, las variables se inicializan de inmediato.
En segundo lugar, en lenguaje C ++, como señaló @nightcracker en su respuesta, estas dos construcciones son semánticamente diferentes. El primero se basa en la inicialización, mientras que el segundo, en la asignación. En C ++, estas operaciones son sobrecargables y, por lo tanto, pueden conducir 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 el medio del bloque, por lo que es posible que vea variables declaradas sin inicializar (o inicializadas con valores ficticios) al comienzo del bloque y luego asignadas significativas valores posteriores, cuando esos valores significativos estén disponibles.
En lenguaje C99 está bien declarar variables en el medio del bloque (al igual que 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 ++).