zoukankan      html  css  js  c++  java
  • C入门之一

    1.stdio.h不要写错成studio.h

    2.

    1 #include <stdio.h>
    2 
    3 int main()
    4 {
    5 /* 我的第一个 C 程序 */
    6 printf("Hello, World! 
    ");
    7 
    8 return 0;
    9 }

    printf字符串必须用双引号,不然就报错hello.c:5:9: warning: character constant too long for its type

    3.在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
    http://blog.csdn.net/gao1440156051/article/details/48035911

    4.define和const的区别
    http://blog.sina.com.cn/s/blog_79b01f6601018xdg.html

    1 #define 宏名称 宏值
    2 
    3 const 数据类型 常量名 = 常量值;

    (1) 编译器处理方式不同
      define宏是在预处理阶段展开。
      const常量是编译运行阶段使用。
    (2) 类型和安全检查不同
      define宏没有类型,不做任何类型检查,仅仅是展开。
      const常量有具体的类型,在编译阶段会执行类型检查。
    (3) 存储方式不同
      define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
      const常量会在内存中分配(可以是堆中也可以是栈中)。

    (4)const 可以节省空间,避免不必要的内存分配。 例如:
    #define PI 3.14159 //常量宏
    const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
    double i=Pi; //此时为Pi分配内存,以后不再分配!
    double I=PI; //编译期间进行宏替换,分配内存
    double j=Pi; //没有内存分配
    double J=PI; //再进行宏替换,又一次分配内存!
    const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

    (5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

    5.c程序中可用的存储类
    -> auto
    -> register
    -> static
    -> extern

    static的示例:

     1 #include <stdio.h>
     2 
     3 /*函数声明*/
     4 void func(void);
     5 static int count = 5;
     6 
     7 main(){
     8 while(count--){
     9 func();
    10 }
    11 return 0;
    12 }
    13 
    14 void func(void){
    15 static int i = 5;/*局部静态变量*/
    16 i++;
    17 printf("i is %d and count is %d
    ", i, count);
    18 }


    extern示例:

     1 //extern_main.c内容
     2 #include <stdio.h>
     3 
     4 int count;
     5 extern void write_extern();
     6 
     7 main(){
     8 count=5;
     9 write_extern();
    10 }
    11 
    12 
    13 //extern_support.c内容
    14 #include <stdio.h>
    15 
    16 extern int count;
    17 
    18 void write_extern(void){
    19 printf("count is %d
    ", count);
    20 }
    21 
    22 //执行
    23 [root@localhost test]# gcc extern_main.c extern_support.c
    24 [root@localhost test]# ./a.out
    25 count is 5

    6.运算符自增自减

     1 #include <stdio.h>
     2 int main()
     3 {
     4 int c;
     5 int a = 10;
     6 c = a++;
     7 printf("先赋值后运算:
    ");
     8 printf("Line 1 - c 的值是 %d
    ", c );
     9 printf("Line 2 - a 的值是 %d
    ", a );
    10 a = 10;
    11 c = a--;
    12 printf("Line 3 - c 的值是 %d
    ", c );
    13 printf("Line 4 - a 的值是 %d
    ", a );
    14 printf("先运算后赋值:
    ");
    15 a = 10;
    16 c = ++a;
    17 printf("Line 5 - c 的值是 %d
    ", c );
    18 printf("Line 6 - a 的值是 %d
    ", a );
    19 a = 10;
    20 c = --a;
    21 printf("Line 7 - c 的值是 %d
    ", c );
    22 printf("Line 8 - a 的值是 %d
    ", a );
    23 }
    24 
    25 /*
    26 先赋值后运算:
    27 Line 1 - c 的值是 10
    28 Line 2 - a 的值是 11
    29 Line 3 - c 的值是 10
    30 Line 4 - a 的值是 9
    31 先运算后赋值:
    32 Line 5 - c 的值是 11
    33 Line 6 - a 的值是 11
    34 Line 7 - c 的值是 9
    35 Line 8 - a 的值是 9
    36 */

    7.位异或运算:
    a^=b等价于a = a^b,其中^是位异或运算,即将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0;否则为1。
    比如,假设,a的值为二进制的1010,b的值为二进制的1100,那么a^b = 0110

    8.c字符串

     1 #include <stdio.h>
     2 
     3 int main ()
     4 {
     5 char greeting[6] = {'H', 'e', 'l', 'l', 'o', ''};
     6 
     7 printf("Greeting message: %s
    ", greeting );
     8 
     9 return 0;
    10 }

    这段代码运行报错error: empty character constant,原因是单引号要有个空格。empty character constant这个英文的意思就是提示空字符。

    9.typedef vs #define
    - typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
    - typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 typedef struct Books
     5 {
     6 char title[50];
     7 char author[50];
     8 char subject[100];
     9 int book_id;
    10 } Book;
    11 
    12 int main( )
    13 {
    14 Book book;
    15 
    16 strcpy( book.title, "C Programming");
    17 book.book_id = 6495407;
    18 
    19 printf( "Book title : %s
    ", book.title);
    20 printf( "Book book_id : %d
    ", book.book_id);
    21 
    22 return 0;
    23 }


    10.文件读写

    1 FILE *fopen( const char * filename, const char * mode );
    2 int fclose( FILE *fp );
    3 int fputc( int c, FILE *fp );
    4 int fputs( const char *s, FILE *fp );
    5 int fprintf(FILE *fp,const char *format, ...)
    6 int fgetc( FILE * fp )
    7 char *fgets( char *buf, int n, FILE *fp )
    8 int fscanf(FILE *fp, const char *format, ...) 

    11.c预处理器

     1 指令    描述
     2 #define    定义宏
     3 #include    包含一个源代码文件
     4 #undef    取消已定义的宏
     5 #ifdef    如果宏已经定义,则返回真
     6 #ifndef    如果宏没有定义,则返回真
     7 #if    如果给定条件为真,则编译下面代码
     8 #else    #if 的替代方案
     9 #elif    如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
    10 #endif    结束一个 #if……#else 条件编译块
    11 #error    当遇到标准错误时,输出错误消息
    12 #pragma    使用标准化方法,向编译器发布特殊的命令到编译器中

    12.预定义宏

    1 宏    描述
    2 __DATE__    当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
    3 __TIME__    当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
    4 __FILE__    这会包含当前文件名,一个字符串常量。
    5 __LINE__    这会包含当前行号,一个十进制常量。
    6 __STDC__    当编译器以 ANSI 标准编译时,则定义为 1

    13.预处理器运算符

     1 宏延续运算符():
     2 一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符().
     3 
     4 字符串常量化运算符(#):
     5 在宏定义中,当需要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符(#)。在宏中使用的该运算符有一个特定的参数或参数列表
     6 
     7 标记粘贴运算符(##):
     8 宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记
     9 
    10 defined() 运算符:
    11 预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。

    14.参数化的宏

    CPP 一个强大的功能是可以使用参数化的宏来模拟函数。例如,下面的代码是计算一个数的平方:

    1 int square(int x) {
    2 return x * x;
    3 }

    我们可以使用宏重写上面的代码,如下:

    1 #define square(x) ((x) * (x))
  • 相关阅读:
    python 教程 第十七章、 网络编程
    SecureCRT循环检查设备状态
    《让僵冷的翅膀飞起来》系列之一——从实例谈OOP、工厂模式和重构
    设计,看上去很美!——“Design & Pattern”团队的第一块砖
    杂拌儿
    换了个计数器
    在Remoting客户端激活方式采用替换类以分离接口与实现
    动动手脚,protected不再被保护
    博客园出现在MSDN中国的首页链接
    近期写作计划和读书安排
  • 原文地址:https://www.cnblogs.com/justdoyou/p/7077691.html
Copyright © 2011-2022 走看看