Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 格式说明符中的差异如何影响值?_C - Fatal编程技术网

C 格式说明符中的差异如何影响值?

C 格式说明符中的差异如何影响值?,c,C,我不明白为什么它在第一种情况下为b和c打印0,即使是为正确的匹配格式说明符 我使用的是Visual Studio。是的,您在格式字符串的一部分中使用了正确的格式说明符,但是由于您在格式字符串的前面已经使用了错误的格式说明符,因此您已经导致了所有的麻烦 具体来说,printf在替换%f和%lf位时已经与数据参数“不一致”。使用错误的转换规范调用未定义的行为。您可能会得到预期或意外的结果,甚至程序崩溃 C11:7.21.6格式化输入/输出函数: 如果转换规范无效,则行为为未定义 您应该知道,C编译器

我不明白为什么它在第一种情况下为b和c打印0,即使是为正确的匹配格式说明符


我使用的是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