C++ 中的格式说明符

Format specifer in C++

我正在尝试了解 C++ 编译器的行为。这是一段代码,我故意犯了两个错误:

  1. scanf 中忘记了 %ld 格式说明符,只写了 %.
  2. printf 添加了未知格式说明符 - 为 long 数据类型写入 %l 而不是 %ld
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // Complete the code.
    int a; long b; char c; float d; double e;
    scanf("%d % %c %f %lf", &a, &b, &c, &d, &e);
    printf("%d \n%l \n%c \n%f \n%lf", a, b, c, d, e);
    return 0;
}

上面有一段成功编译并显示警告的片段。为什么它没有为 unknown/missing C++ 格式说明符产生错误?它是如何编译的?

输出:

因为 % </code> 不是未知的格式说明符,而只是 - 百分号,后跟(一个或多个)白色 space。在您的输入流中搜索百分号,如果 none 按预期显示,它将停止匹配,并且 returns 已分配字段的数量 - 一个。</p> <p>显然,这很少是编码人员的意图,因此编译器会对此发出警告。更清楚地说明您想要一个真正的百分号的方法是使用 <code>%%。对编译器来说,百分比和空白的味道就好像你犯了一个错误,但这并不是形式上的错误;因此这只是一个警告。

编译器甚至不需要告诉你(谢天谢地它会告诉你!)。格式字符串和参数列表不匹配是未定义的行为。

单个%后跟[=​​15=]是无效的说明符,也是未定义的行为。