我在C书中的C示例中看到了这两个参数,但作者没有详细说明两者之间的区别.我知道这%f表明浮动应该取而代之.我试着查看这个,但很难找到这个w符号.怎么样%lf?
M.M*_*M.M 26
对于scanf,%f读入a float,并%lf读入double.
对于printf:在C99及更高版本中,它们都是相同的,并且它们打印为a float或a double.在C89中,%lf引起了不确定的行为,尽管它是将其视为一种常见的扩展%f.
一个说明符可用于两种不同类型的printf原因是由于默认参数提升 ; 当用于调用函数而不匹配函数原型中的参数时,类型的参数float被提升为double.所以printf只要double在任何一种情况下看到.
pax*_*blo 12
printf家庭没有区别.ISO C11标准(以下所有参考均来自C11),部分7.21.6.1 The fprintf function,段落/7状态,l修饰符(我的粗体):
指定以下d,i,o,u,x或X转换说明符适用于long int或unsigned long int参数; 以下n转换说明符适用于指向long int参数的指针; 以下c转换说明符适用于wint_t参数; 以下s转换说明符适用于指向wchar_t参数的指针; 或对后续的a,A,e,E,f,F,g或G转换说明符没有影响.
它不需要修改说明f符的原因是因为该说明符已经表示a double,来自/8同一部分的段落:
表示浮点数的双参数在样式中转换为十进制表示法...
这与以下事实有关:函数原型中椭圆后面的参数根据部分6.5.2.2 Function calls段落进行默认参数提升/7:
...函数原型声明符中的省略号表示法导致参数类型转换在最后声明的参数之后停止.默认参数提升是在尾随参数上执行的.
由于printf(实际上整个printf类似函数族)被声明为int printf(const char * restrict format, ...);省略号表示法,因此该规则适用于此处.默认参数提升将在第6.5.2.2 Function calls款/6:
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double.这些被称为默认参数促销.
对于scanf家庭来说,它要求使用a double而不是a float.部分7.21.6.2 The fscanf function /11:
指定以下d,i,o,u,x,X或n转换说明符适用于类型指针为long int或unsigned long int的参数; 后面的a,A,e,E,f,F,g或G转换说明符适用于类型指针为double的参数; 或者后面的c,s或[转换说明符适用于带有指向wchar_t的类型指针的参数.
这会修改该/12部分的段落,其中指出%f:
匹配可选的带符号浮点数,无穷大或NaN,其格式与strtod函数的主题序列的预期格式相同.相应的参数应该是浮动的指针.