gpt4 book ai didi

c - 它的输出是什么?为什么?

转载 作者:行者123 更新时间:2023-11-30 21:32:17 25 4
gpt4 key购买 nike

我正在研究范围规则问题和所有问题,然后得到一个代码片段,如下:

#include <stdio.h>
int main()
{
int x = 1, y = 2, z = 3;
printf(" x = %d, y = %d, z = %d \n", x, y, z);
{
int x = 10;
float y = 20;
printf(" x = %d, y = %f, z = %d \n", x, y, z);
{
int z = 100;
printf(" x = %d, y = %f, z = %d \n", x, y, z);
}
}
return 0;
}

如果我将最后一次打印更改为:

printf("x = %d, y = %d, z = %d \n", x, y, z);

我得到以下输出,但我不明白:(Ideone link)

x = 10, y = 0, z = 1077149696

那么,你能解释一下为什么 z 打印这个值吗?

最佳答案

x、y 和 z 解析为大多数本地定义。

当您使用不正确的 printf % 说明符时,行为未定义。

y 是 float ,但您正在使用 %d 来打印它(在后面的行中)。

printf 使用可变参数,一旦您使用不正确的说明符(在本例中为 %d 而不是 %f)破坏了堆栈,堆栈就会被破坏,并且堆栈数据的错误解释(在不正确的偏移量处)将会造成许多痛苦的意外。

解码此 UB

这就是您的计算机上可能发生的情况(一种可能的解释)。因为default argument promotion ,位模式(十六进制)0x4034000000000000被插入堆栈 20.0f。 Little-Endian 机器上的 Sizeof int 是 4 个字节。当您将 float 作为 int 打印时,您的机器会消耗 0x00000000 并解释为 int,首先打印 0,稍后 %d 消耗 0x40340000 将其解释为 int 并打印 1077149696。最终 100 ( 0x00000064) 留在堆栈中未使用并且 printf 返回。

但永远不要依赖于此,并始终编写明确定义行为的代码。

关于c - 它的输出是什么?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25926901/

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