Vous avez balisé vos questions C et C ++ en même temps, alors que la réponse est très différente dans ces langages.
Premièrement, le libellé du titre de votre question est incorrect (ou, plus précisément, sans pertinence pour la question elle-même). Dans vos deux exemples, la variable est déclarée et définie simultanément, sur une ligne. La différence entre vos exemples réside dans le fait que dans le premier cas, les variables sont laissées non initialisées ou initialisées avec une valeur fictive, puis une valeur significative lui est attribuée ultérieurement. Dans le deuxième exemple, les variables sont immédiatement initialisées .
Deuxièmement, en langage C ++, comme @nightcracker l'a noté dans sa réponse, ces deux constructions sont sémantiquement différentes. Le premier repose sur l'initialisation tandis que le second - sur l'affectation. En C ++, ces opérations sont surchargeables et peuvent donc potentiellement conduire à des résultats différents (bien que l'on puisse noter que produire des surcharges non équivalentes d'initialisation et d'affectation n'est pas une bonne idée).
Dans le langage C standard d'origine (C89 / 90), il est illégal de déclarer des variables au milieu du bloc. C'est pourquoi vous pouvez voir des variables déclarées non initialisées (ou initialisées avec des valeurs nominales) au début du bloc, puis affectées de manière significative. les valeurs plus tard, lorsque ces valeurs significatives deviennent disponibles.
En langage C99, il est correct de déclarer des variables au milieu du bloc (comme en C ++), ce qui signifie que la première approche n'est nécessaire que dans certaines situations spécifiques lorsque l'initialiseur n'est pas connu au moment de la déclaration. (Cela s'applique aussi au C ++).