C 格式说明符中的差异如何影响值?
我不明白为什么它在第一种情况下为b和c打印0,即使是为正确的匹配格式说明符C 格式说明符中的差异如何影响值?,c,C,我不明白为什么它在第一种情况下为b和c打印0,即使是为正确的匹配格式说明符 我使用的是Visual Studio。是的,您在格式字符串的一部分中使用了正确的格式说明符,但是由于您在格式字符串的前面已经使用了错误的格式说明符,因此您已经导致了所有的麻烦 具体来说,printf在替换%f和%lf位时已经与数据参数“不一致”。使用错误的转换规范调用未定义的行为。您可能会得到预期或意外的结果,甚至程序崩溃 C11:7.21.6格式化输入/输出函数: 如果转换规范无效,则行为为未定义 您应该知道,C编译器
我使用的是Visual Studio。是的,您在格式字符串的一部分中使用了正确的格式说明符,但是由于您在格式字符串的前面已经使用了错误的格式说明符,因此您已经导致了所有的麻烦
具体来说,
printf
在替换%f
和%lf
位时已经与数据参数“不一致”。使用错误的转换规范调用未定义的行为。您可能会得到预期或意外的结果,甚至程序崩溃
C11:7.21.6格式化输入/输出函数:
如果转换规范无效,则行为为未定义
您应该知道,C编译器不够聪明,无法理解格式字符串并正确地转换以下参数。因此,您的论点可能会被错误地处理;对于
printf
,它们只是堆栈上的一些字节。值为15.0的double
表示法很可能在堆栈上包含多个0字节,而printf
读作int
s,因为您告诉它在格式字符串中这样做。是真的,但对于试图了解发生了什么的人来说相当空洞。此外,一个人甚至可能得到42@luk32;甚至硬盘崩溃@haccks我认为一个编译器,故意在UB上输出42,将是一件有趣的事情。但是你的想法完全掩盖了它;我喜欢破坏乐趣P
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a = 5;
float b = 10;
double c = 15;
printf("%d %f %lf\n", a, a, a);
printf("%d %f %lf\n", b, b, b);
printf("%f\n", b);
printf("%d %f %lf\n", c, c, c);
printf("%lf\n", c);
}
5 0.000000 0.000000
0 0.000000 0.000000
10.000000
0 0.000000 0.000000
15.000000