您的位置:首页 > 编程语言 > C语言/C++

C语言的细节(不定期更新)

2007-04-11 09:03 274 查看
1.字符串换行

c语言中,所有的空格、注释、TAB、换行都可以任意写,但是字符串中不可以。如果要换行,就像这样

printf("a very very very very"
"long string");

这个是C89以后才支持,老的风格是

printf( "a very very /
very long line");

2 pow函数

pow()的返回类型为double,在对整数作power运算是需要留意这一点。

3 scanf()

scanf()在读取double型数据时,应使用"%lf"修饰符,仅用"%f"是无法正确读取数据的。

4 可变参数

C里面使用可变参数的时候,所有参数会进行类型提升。

也就是说,float类型会作为double参数传入,char/short会作为int参数传入。

所以无论如何,只要输入浮点数,printf收到的都是double类型的参数。

5 字符常量

C中字符常量在内存中是以int的形式存储的,即sizeof('a')=4
而在C++中字符常量是以char的形式存储的,即sizeof('a')=1

6 符号*在printf和scanf中的不同作用

在printf()中,宽度和精度中的任何一个或两者都可以用符号*来指定,这表示该值将通过转换下一个参数得到(要求下一个参数类型必须为int)。

在scanf()中,*代表赋值屏蔽字符,例如%*s,表示忽略一个字符串,%*d,表示忽略一个整数。

7 main()函数的原型

    在C99和C++ 98中,只有以下两种形式的main函数才是合法的:

    int main ( int argc, char * argv[])
    int main ( void)

8 fseek

fseek()用于文本文件时很容易出错,最好用于二进制文件。理由很简单,由于文本文件在存储时可能发生字符转换(如在windos系统中自动将/n转换为/r/n的形式存储在文件中),所以在文件中的字节和你想要寻找的字节之间可能不存在直接的对应关系。

9 printf中的%n限定符

    于其它格式限定符(如%x,%d)不同,它并不告诉printf以何等格式显示对应的参数,而是将目前已输出的字符个数放入参数指定的变量中。例如:

    int count;
    printf("this%n is a test /n",&count);

    执行结果count的值为4。

10 printf中的#限定符

    (1).如果g,G,f,E或e前面有符号#,就可以确保即使没有小数位也要显示小数点。
    (2).如果x或X前面有符号#,那么16进制数将带0x前缀表示。
    (3).如果在o前面有符号#,那么打印出的8进制数将前补0

11 void 指针

   C和C++都允许将任何其它类型的指针赋值给void指针而无需显式的类型转换。
  
   但是如果反过来,即将void指针赋值给其它类型指针,在C中仍然不需要显式的类型转换,但在C++中必须进行显式类型转换,这是因为C++有更严格的类型检查机制。

12  函数原型中的void

    在C中,如果要定义某个函数不带任何参数,需要在参数列表中显式使用void,否则编译器会将函数原型解释为具有不定个数的参数

   在C++中,对于不带参数的函数,则不需要显式使用void。

13 为什么"    static char * pc =malloc(10);“ 会报错?

[C99] 6.7.8 Initialization

4     All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息