为什么在printf中传递的int和float会转到格式字符串中的错误位置?

nar*_*ndy 0 c printf format-specifiers

printf函数int到%f,浮动到%d试图实验

#include<stdio.h>                                              
int main(){                                                    
    int i=10;                                                     
    float x=43.2892f;                                              
    printf("i=%f  x=%d \n",i,x);                               
    return 0;                                                  
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

i=43.289200  x=10      
Run Code Online (Sandbox Code Playgroud)

需要帮助来理解为什么这些变量是互换的?

You*_*You 13

你正在做什么调用未定义的行为1,但是在具有System V AMD64 ABI的平台上使用GCC 查看生成的程序集,我们可能会提出一个假设.浮点值在寄存器(SSE寄存器)中传递,而整数在寄存器(通用寄存器)中传递.据推测,您的实现要求在SSE寄存器中传递浮点数,并将整数传递到通用寄存器中,并且只需在遇到第一个寄存器时选择要读取的寄存器(反之亦然).xmm0esiprintfxmm0%f


1 未定义的行为不必是"随机"或"每次都不同".在这种情况下,未定义的行为非常一致.未定义的行为甚至可能正是您期望发生的行为; 但是在升级编译器时它也可能会改变.