C+中的格式说明符+; 我正在尝试理解C++编译器的行为。这是一个代码,我故意犯了两个错误: 在scanf中忘记了%ld格式说明符,只写了% 为printf添加了未知格式说明符-为long数据类型编写了%l而不是%ld #包括 #包括 使用名称空间std; int main(){ //完成代码。 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); 返回0; }
上面有一个代码段,成功编译并显示警告。为什么它没有为未知的/丢失的C++格式说明符产生错误?它是如何编译的 输出:C+中的格式说明符+; 我正在尝试理解C++编译器的行为。这是一个代码,我故意犯了两个错误: 在scanf中忘记了%ld格式说明符,只写了% 为printf添加了未知格式说明符-为long数据类型编写了%l而不是%ld #包括 #包括 使用名称空间std; int main(){ //完成代码。 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); 返回0; },c++,gcc,compiler-warnings,C++,Gcc,Compiler Warnings,上面有一个代码段,成功编译并显示警告。为什么它没有为未知的/丢失的C++格式说明符产生错误?它是如何编译的 输出: 因为%不是一个未知的格式说明符,而是一个百分号,后跟(一个或多个)空格。您的输入流将被搜索百分号,如果没有出现预期的百分号,它将停止匹配,并返回已分配字段的数量-1 显然,这很少是编码人员的意图,因此编译器会给出警告。要更清楚地说明您想要一个真正的百分号,可以使用%%。百分比和空白对编译器来说就像你犯了错误一样,但它在形式上并不是不正确的;因此,它只是一个警告。因为%不是一个未知的
因为
%
不是一个未知的格式说明符,而是一个百分号,后跟(一个或多个)空格。您的输入流将被搜索百分号,如果没有出现预期的百分号,它将停止匹配,并返回已分配字段的数量-1
显然,这很少是编码人员的意图,因此编译器会给出警告。要更清楚地说明您想要一个真正的百分号,可以使用
%%
。百分比和空白对编译器来说就像你犯了错误一样,但它在形式上并不是不正确的;因此,它只是一个警告。因为%
不是一个未知的格式说明符,而是一个百分号,后跟(一个或多个)空格。您的输入流将被搜索百分号,如果没有出现预期的百分号,它将停止匹配,并返回已分配字段的数量-1
显然,这很少是编码人员的意图,因此编译器会给出警告。要更清楚地说明您想要一个真正的百分号,可以使用
%%
。百分比和空白对编译器来说就像你犯了错误一样,但它在形式上并不是不正确的;因此,这只是一个警告。编译器甚至不需要告诉您这一点(谢天谢地它会告诉您!)。格式字符串和参数列表之间的不匹配是未定义的行为
单
%
后跟空格是无效的说明符,这也是未定义的行为。编译器甚至不需要告诉您这一点(谢天谢地它会告诉您!)。格式字符串和参数列表之间的不匹配是未定义的行为
单
%
后跟空格是无效的说明符,这也是未定义的行为。您应该将警告视为错误。他们不可忽视。:)您应该将警告视为错误。他们不可忽视。:)
#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;
}