gpt4 book ai didi

c - printf 语句中的不同数据类型变量在打印顺序中如何相互影响

转载 作者:太空狗 更新时间:2023-10-29 15:17:49 26 4
gpt4 key购买 nike

当我执行这段代码时:

void main(){
float a=3;
int b=5;
printf( "%d %d \n", a, b);
}

我得到输出为

0 1074266112 

当我改变打印顺序时,即

printf("%d %d \n",b,a);

我得到这个作为输出:

5 0

为什么?

最佳答案

由于您的说明符与实际值不匹配,您调用了未定义的行为。这意味着任何事情都可能发生,尤其是,行为可能会在程序调用之间发生变化(如果格式说明符读取的数据多于实际提供的数据)或至少在编译器设置之间。


内部可能发生的事情取决于许多因素,例如 int 值的长度等等。无论如何,这都是你不能依赖的。

这里真正发生的是:float 在传递给可变参数函数时自动提升为 double,将它们的长度更改为 8 个字节。

我这样修改了你的程序:

#include <stdio.h>

void main(){
float a=3;
int b=5;
printf("%08x %08x %08x\n", a, b);
printf("%08x %08x %08x\n", b, a);
printf("%d %d %d\n", a, b);
printf("%d %d %d\n", b, a);
}

给出输出

00000000 40080000 00000005
00000005 00000000 40080000
0 1074266112 5
5 0 1074266112

所以我们准确地看到了值。通过堆栈传递给 printf() 的字节。由于这些值由于字节顺序而被交换(当通过 %08x 解释时它们在视觉上被交换),我真的有字节

00 00 00 00  00 00 08 40  05 00 00 00
05 00 00 00 00 00 00 00 00 00 08 40

如果我们现在使用错误的说明符,我们会得到映射

00 00 00 00 -> 00000000 -> 0
00 00 08 40 -> 40080000 -> 1074266112
05 00 00 00 -> 00000005 -> 5

然后输出。

如果我省略了一个 %d,相应的最后一个值也会被省略,导致

0 1074266112
5 0

依次。

所以您的 b 值似乎发生变化的原因是,在第一种情况下,您确实获得了 a 值的“其他”部分。

关于c - printf 语句中的不同数据类型变量在打印顺序中如何相互影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com