graybull's Blog
C语言声明的优先级规则--如何看懂复杂的声明语句
- C语言声明的优先级规则
- 解读一个复杂例子char* const *(*next)();
- 使用typedef
C语言复杂的声明语句,总是让人很头痛。这里,我摘录了《C专家编程》的一段内容,来简要地阐述以下如何看懂这些复杂的东东。
举例:char * const * (*next) (); //请问这是神马意思?
如果你对此还有疑问,请看下文。
printf与scanf在处理double时的不同
1. 在windows下,下面语句是正常执行的:
double var=0.618;
printf("%Lf\n",var);
然而,在Linux下该printf执行异常。故处理printf和scanf时避免使用 %Lf (大写L)。
2.
- scanf 读取float: scanf("%f",&var);
- scanf 读取double: scanf("%lf",&var);
3. printf 与scanf 的情况有些不同。
float var1=1.0;
double var2=1.0;
printf("%f", var1); //都是 %f
printf("%f",var2); //都是 %f
%f 在printf 看来是输出double变量(不是float);而float变量在传给printf时,编译器将它变成double类型。
至于%lf, printf也能正常输出。
建议统一在 printf 中使用 %f 。
参考:
printf 的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内 有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。
(严 格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确 保可移植性,就要坚持使用%f。)。对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向 double存储大不一样,因此,scanf区别%f和%lf。