【WIP】C基础语法

创建: 2017/06/17

更新: 2017/10/14 标题加上【WIP】,增加创建时间
更新: 2018/02/05 被Objective-C引用部分加上id方便链接,代码放进代码模板 
 

 基础
 基本类型  
 字符  char   ‘A'
 整数  int   123
 浮动小数点数  float   123.123
 双倍浮点数  double  123.123
 无  void
 变量类型  
 局部变量  
 全局变量  
   
   
   
 注释  
   
 //....  
 注意  C的注释不能嵌套
   
   
   
   
   
   
 控制语句
 if  
if (a > 0) {
    printf("a > 0\n");
}else if (a == 0) {
    printf("a = 0\n");
}else {
    printf("a < 0\n");
}

 

 switch  
switch (a) {
    case 1:
        printf("a = 1\n");
        break;
    case 2:
        printf("a = 2\n");
        break;
    case 3:
        printf("a = 3\n");
        break;
    default:
        printf("a != 1, 2, 3\n");
        break;
}

 

 

 for
for (i = 0; i < a; i++) {
    printf("i = %d\n", i);
}

 

   
 do...while 

 

int i = 0;
do {
    printf("i = %d\n", i);
    i++;
}while(i < a);

 

   
   
   
   
 数据类型与式
 数据类型修饰符   
 long  long int %ld
 long double 也可以  %lf
 short   short int %hd
 signed  默认int, char都自带这个
 unsigned  unsigned int   %u
(long .. %lu  short ... %hu)
 unsigned char 
 输出时  float, double 都是%f
 输入时  float %f
 double %lf
 long double %Lf
   
   
 变量类型  
 全局变量  scope为程序全体
 局部变量  scope为声明所在范围  
 (auto, 默认添加,故省略)
 auto int sample;
 函数的参数是特别的局部变量
 
 
 
   
   
   
   
   
   
   
   
 
 常数  具体字符或者const声明过的量
 小数  普通表达 123.123 
 科学计数法 1.23123E2
 字符常量  'Z'
 也可以直接带数字
 char test = 65
 进制  
 十六进制   0x12F 
数值大小写无所谓
 八进制  07878
   
   
   
 末尾添加识别符  
 float  F
 12.2F
 long double  L 
 12.2L
 unsigned  U
 21U
 long  L
 12L
   
   
   
   
   
   
   
   
   
   
   
   
 声明与定义  
 声明  int a;
 定义  a = 10;
 int a = 10; 声明并定义
 类型转换  
 式子里的类型转换  
 整数提升
integral promotion
 char, short变成int
 类型提升
type promotion
 变成最大的类型
 long double > double >
 float > unsigned long >
 long > unsighed > int ...
 代入的类型转换  
 整数(char) -- 整数(long)  丢失高位
 整数 -- 浮点数  丢失小数点以下
 类型转换  (type)val
 例: (double)12
   
   
   
   
   
   
   
   
   
   
   
   
   
 数组与字符串
 数组  
 声明   
 一元数组  type name[size];

 例: int arraytest[128];
 多元数组  type name[size][size][size]
 例: int arraytest[128][128][128]
   
   
   
 定义  name[size] = {val1, val2, ....}

 例: arrayTest[5] = {1, 2, 3, 4, 5};
      arrayTest[2][3] = {
          {1, 2, 3},
          {1, 2, 3},
          {1, 2, 3}
      }
 初始化并定义的话可以不指定长度
 自动判断
 int a[] = {1, 2, 3}
 char str[] = "..."
   
   
   
   
 注意  C语言不自动检查索引的范围,要程序员自己注意
 无法复制数组全体,要复制只能一个一个元素复制

 一元字符串初始化 str[128] = "..."
   
   
   
 字符串  
 C语言中的字符串  带Null文字('0')的字符数组
 以'0'结尾
 读取字符串   gets()
 头文件  stdio.h
 作用  一直接受到遇到\n为止,把换行转为'0' 
 注意  不检查范围,有多少接受多少。
 可能超出数组的范围
   
   
   
   
 标准库  string.h
 基本的文字库函数  
 复制  strcpy(target, source)
 把source复制到target上
注: 不检查范围
 连接  strcat(target, source)
 把source添加到target后面
 注: 不检查范围
 比较  strcmp(str1, str2)
 1 》2  >0
 1 = 2  = 0 完全相同返回0
 1《 2   < 0
 长度  strlen(str)
 注: 最后的零字符'0'不计入 
   
   
   
   
   
   
 转换类库函数  atoi("100")  // 100
 标准库  stdlib.h
 atoi(str)  str ---> int
 atof(str)  str ---> double
 atol(str)  str ---> long int
 exit(n)  退出程序,0为正常退出
 
 和return区别  
 exit()在哪里都会直接结束程序
 递归中也是直接退出
 
   
   
   
   
   
   
   
   
   
   
   
   
 指针
 运算符  
 星号获取地址的值
 (アスタリスク,asterisk)
 *
 和号获取地址
 (アンパサンド,Ampersand)
 &
   
   
   
 声明  type *val;
 例: int *test;
 注意  
 指针和指针所指对象要相同数据类型  
 指针在初始化(指向某处)之前不能用  
 零指针(NULL)试做无效指针,不指向任何地方  
 不带索引的数组表示数组开头的地址  int a[128];
 a = &b;
 
int testA[128], testB[128];
for(i = 0; i < sizeof(testB)/sizeof(int); i++) {
    testB[i] = i;
}
*testA = *testB;
for(i = 0; i < sizeof(testA)/sizeof(int); i++) { //给testB赋值
    printf("testA[%d] = %d   ", i, testA[i]);
    printf("testB[%d] = %d\n", i, testB[i]);
}//说明不可以直接把数组复制
int *p;
p = testB; //p指向testB的开头
i = 0;
while (i < sizeof(testB)/sizeof(int)) {//指针遍历数组
    printf("testB[%d] = %d\n", i, *(p++));
    //p++;
    i++;
}

 

 
 指针运算是实际值
 +1是前进1个数据大小的地址
 
   
   
   
   
 
   
   
   
   
   
   
   
   
   
   
   
 函数与递归
 函数原型  void test();
 放在开头
 也就是函数的声明,定义放在其他地方
 长度不定的函数  int test(int a, ...);
   
   
   
  &nbr>
   
 输入输出I/O
 EOF  -1
 宏替换  #define SAMPLE 0
 输入输出1
 (字符)
 
 头文件: stdio.h
 输入
 int getchar(void)  直接带入char
 高位直接舍弃(高位本来就没用)
 失败返回EOF,也就是-1 
 文件输入输出时候重定向也可能出错
 不用检验,失败了基本是硬件问题
   
   
 输出
 int putchar(int ch)  
 失败返回EOF,也就是-1  不用检验,失败了基本是硬件问题
   
   
 输入输出2
 (字符串)
 
 头文件: stdio.h
 输入
 char *gets(char *str)  读到改行
 返回值
 成功返回字符串开头的指针
 失败返回NULL
   
   
 输出
 int puts(char *str)  输出str并附加\n
 返回值  
 成功返回正数 
 失败返回EOF,也就是-1
   
   
 printf  
 指定  %[+/-][[0]最小幅度][.][精度]格式修饰符
 %c   字符
 %d
 %i
 带符号的10进制整数
 %e
 %E
 小数的科学计数法
 1.234e10
 1.234E10
 %f  10进制小数
 double, float
 %g
 %G
 %f和%e中小的那个
 %f和%E中小的那个
 %o  不带符号的8进制数
 %s  字符串 
 %u  不带符号的10进制数
 %x
 %X
 不带符号的16进制数  小写 
 不带符号的16进制数  大写
 %p  指针
 注:用其他格式指定的话,高位会被舍弃(已测试)
 %n  ???
 %%  %符号
   
   
   
   
   
   
   
 scanf  主要用来读取数字
 %c  字符
 %d
 %i
 10进制整数 
 两个一样
 short 带h
 long 带l
 %e
 %f
 %g 
 小数 
 三个一样
 默认float
 double用l
 long double 用L
 %o  8进制整数
 short 带h
 long 带l
 %x  16进制整数
 short 带h
 long 带l
 %s  字符串
 不推荐
 遇到空白(空格,tab,换行)会自动结束
 %p  指针
 %n  ???
 %u  不带符号的10进制整数
 short 带h
 long 带l
 %[]  字符集合
 一直读到集合里没有的
 指定范围, 可用 -
 [AB], [ABC], [01A]
 [A-Z]
 [A-Za-z]
 [0-9]
 想指定"-"必须放开头或者结尾
 [-...]
 [...-]
 [^...]    除去指定的
 
 
 
 %*c  忽视一个字符 
 %*格式修饰符
 忽略这个
 空格
 任意字符
 忽略所以空格直到出现一个非空格的
 如"%d %d"读取  1                 2
 和他一直的以外的全部丢掉
 可以指定长度  除了%c 和%n
 如 s ]
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 文件输入输出
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 构造体与共用体
 声明构造体  struct tag {
   member1;
   member2; ...
 };
 加强版 typedef struct tag Tag;



 
struct test {
    int a;
    int b;
};

typedef struct test Test;

 

typedef enum { false, true } bool;

 

 声明变量  struct tag val-name;
 Tag val-name;
例 

Test test1 ;

 初始化  
 单个   

Test test1 = {

        .a = 1,

        .b = 2

    };

 结构体的数组  

Test test[2] = {

        {.a = 1, .b = 2},

        {.a = 3, .b = 4}

    };

 获取成员  
 点运算符   val-name.mem-name
 例: test1.a
   
 箭头运算符  val-name->mem-name
例:  test2 = &test1;
      test2->.a
   
   
 计算大小  sizeof (struct tag)
 sizeof(Tag)
 结构体的嵌套  结构体的成员可以是结构体
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 复杂的数据类型与运算符
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 预处理以及其他高度的话题
 动态分配内存  
 库文件: stdlib.h
 分配
 void *malloc(size_t numbytes);
分配区别没有初始化
 返回分配的内存的开头指针
 失败的话返回NULL
 要检验是否失败
 void *calloc(size_t nmemb, size_t size);
区别:nmemb指定分配大小的个数,并且所有区域以0初始化 
 要类型转换
   
   
 释放
 void free(void *ptr);  
   
   
   
 static声明函数  仅在当前文件内的函数可见
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

 

posted @ 2017-06-17 04:02  懒虫哥哥  阅读(359)  评论(0编辑  收藏  举报