为什么在阅读时scanf()需要l" %lf" double,何时printf()可以使用" %f",无论其参数是a double还是a float?
示例代码:
double d;
scanf("%lf", &d);
printf("%f", d);
Run Code Online (Sandbox Code Playgroud) 除了%hn和%hhn(指定h或hh指定指向对象的大小),格式说明符的h和hh修饰符有printf什么意义?
由于标准要求的默认促销适用于可变函数,因此不可能将类型char或short(或其任何有符号/无符号变体)的参数传递给printf.
根据7.19.6.1(7),h修饰符:
指定以下d,i,o,u,x或X转换规范适用于short int或unsigned short int参数(该参数将根据整数提升进行提升,但其值应转换为short int或打印前的unsigned short int); 或者后续的n转换规范适用于指向short int参数的指针.
如果参数实际上是类型short或unsigned short,则促销int后转换回short或unsigned short将产生与促销相同的值int而不进行任何转换.因此,对于类型的参数short或unsigned short,%d,%u等应给予相同的结果到%hd,%hu等.(并且同样地对于char类型和hh).
据我所知,h或者hh修饰符可能有用的唯一情况是当参数将其传递int到范围之外时,short或者unsigned short …
从上一个问题:
如果你试图传递
float给printf它,它会double在printf收到它之前被提升
printf()是一个可变函数吧?可变参数函数在传递之前是否会提升float参数double?