Dra*_*scu 36 c double printf stdin stdout
假设我在C中有以下代码:
double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);
Run Code Online (Sandbox Code Playgroud)
它从stdin变量'var'读取,然后在stdout'var'中打印两次.我理解你是如何从stdin读取双变量的,但我的问题是:
Yu *_*Hao 43
对于像printf和这样的变量参数函数scanf,参数被提升,例如,任何较小的整数类型都被提升为int,float被提升为double.
scanf获取指针的参数,因此促销规则不起作用.它必须%f用于float*和%lf为double*.
printf永远不会看到一个float论点,float总是被提升为double.格式说明符是%f.但C99也表示%lf相同%f的printf:
C99§7.19.6.1该
fprintf功能
l(ELL)指定一个以下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转换说明.
Eri*_*hil 11
当a float传递给printf它时,它会自动转换为a double.这是默认参数提升的一部分,它适用于具有可变参数列表(包含...)的函数,主要是出于历史原因.因此,"自然"说明符的float,%f必须有一个工作double的说法.所以%f和%lf说明者printf是一样的; 他们都有double价值.
当scanf被调用时,指针传递,而不是直接的价值.指向的指针float未转换为指针double(由于指向对象在更改指针类型时无法更改,因此无法工作).所以,因为scanf,参数%f必须是指针float,而参数%lf必须是指针double.
小智 6
至于我阅读手册页,scanf说'l'长度修饰符指示(在浮点的情况下)参数是double类型而不是float类型,所以你可以有'lf,le,lg'.
至于打印,正式,手册说'l'仅适用于整数类型.因此,某些系统或某些标准可能不支持它.例如,我在编译时收到以下错误消息gcc -Wall -Wextra -pedantic
a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]
Run Code Online (Sandbox Code Playgroud)
因此,如果您的标准支持语法,您可能需要重新检查.
总而言之,我会说你用'%lf'阅读并用'%f'打印.