Impression de variables int avec spécificateur de format float

int main() { int a=5; float b=7.5; printf("%d %f\n",a,b); printf("%d %f\n",a,a); return 0; } 

quand je comstackr cela en sortie du compilateur gcc est

 5 7.500000 5 7.500000 

Mais dans Visual Studio, la sortie est

 5 7.500000 5 0.000000 

Je ne suis pas capable de comprendre la sortie du compilateur gcc.

printf prototype printf est:

 int printf(const char *format, ...); 

C11 (n1570), § 6.5.2.2 Appels de fonction

La notation des points de suspension dans un déclarateur de prototype de fonction provoque l’arrêt de la conversion du type d’argument après le dernier paramètre déclaré. Les promotions d’argument par défaut sont effectuées sur les arguments de fin.

C11 (n1570), § 6.5.2.2 Appels de fonction

les promotions entières sont effectuées sur chaque argument et les arguments de type float sont promus en double. Celles-ci sont appelées les promotions d’arguments par défaut.

Par conséquent, aucune autre promotion d’argument n’est effectuée avec un appel à printf . En particulier, a n’est pas converti en double . Il en résulte un comportement indéfini: printf essaiera d’obtenir un double avec une taille donnée ( sizeof(double) ) et une représentation en mémoire donnée, qui pourrait être différente d’un int .

C11 (n1570), § 7.21.6.1 La fonction fprintf

Si une spécification de conversion n’est pas valide, le comportement n’est pas défini. Si l’un des arguments n’est pas du type correct pour la spécification de conversion correspondante, le comportement est indéfini.

En outre, vous pouvez consulter le code ASM généré par gcc pour voir ce qui se passe.