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。

 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee