C++ 中的格式说明符
Format specifer in C++
我正在尝试了解 C++ 编译器的行为。这是一段代码,我故意犯了两个错误:
- 在
scanf
中忘记了 %ld
格式说明符,只写了 %
.
- 为
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=]是无效的说明符,也是未定义的行为。
我正在尝试了解 C++ 编译器的行为。这是一段代码,我故意犯了两个错误:
- 在
scanf
中忘记了%ld
格式说明符,只写了%
. - 为
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=]是无效的说明符,也是未定义的行为。