我想知道为什么这段代码的输出是0?
y.beta
和p->beta
是相同的变量,所以输出不应该是 3 吗?
int main() {
struct MyType {
int alpha;
double beta;
};
static struct MyType y;
struct MyType *p = &y;
y.alpha = 1;
p->alpha = 2;
p->beta = 2.5;
y.beta = 1.5;
printf("%d", y.beta + p->beta);
return 0;
}
最佳答案
如chqrlie正确指出,printf("%d", somevariable)
期望变量作为 int
传递,而您的结果是 double
输入值。
%d
称为格式说明符。这些是必需的,因为不同的数据类型由处理器以不同的方式传递和解释,可能位于内存中的不同位置或不同的寄存器中(就像 x86_64 平台的情况)。因此,即使具有相同位模式的相同内存位置,根据数据类型的解释也可能有很大不同。这就是另一个示例中发生的情况:
int main() {
int a = 1048577;;
printf("%d\n", a);
printf("%hd", a); //hd is the format specifier for short int
return 0;
}
输出:
1048577
1
如您所见,根据您指定的数据类型,相同的变量 a 会有不同的解释。
为什么会这样?
这是 1048577 的二进制表示(假设为 32 位 int
):
00000000 00010000 00000000 00000001
如果格式说明符为 short int
(%hd
),则 Shorts 为 16 位宽,仅使用该值的 16 个低位,因此输出为1
。
在某些架构(x86 32 位)上,您的情况可能会发生类似的情况,或者在其他架构上发生更糟糕的情况,其中 double
值以不同的方式传递,并且 printf
从调用者未写入任何特定内容并且可能碰巧存在任何随机值的位置获取 int
,例如 0
。
解决这个问题的方法是将代码修改为
printf("%f", y.beta + p->beta);
正如 chqrlie 所指出的
关于c - 为什么不同的格式说明符会使用 printf 给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835599/