我正在尝试弄清C ++编译器的行为。在这里,我故意犯了两个错误:
%ld
中的scanf
格式说明符,只写了%
。printf
中添加未知格式说明符,对于%l
数据类型写%ld
而不是long
。#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;
}
上面的代码段已成功编译并显示警告。为什么没有为未知/缺少C ++格式说明符引发错误?它是如何编译的?
因为%
不是未知的格式说明符,而是-百分号,后跟(一个或多个)空格。在输入流中搜索百分号,如果没有出现预期的百分号,它将停止匹配,并返回已经分配的字段数-一个。
显然,这很少是编码人员的意图,因此编译器会对此发出警告。更清楚地说出您想要真实百分号的方法是使用%%
。编译器发出的百分比和空白气味就像您犯了一个错误一样,但是在形式上并没有错。因此,这只是一个警告。
即使编译器也不需要告诉您(谢天谢地!)。格式字符串和参数列表之间的不匹配是未定义的行为。
在scanf
中,不带说明符的%
只是字面上的百分号,因此它不是无效的。