C语言基础01--初见C语言

Catalogue
  1. 1. C语言基础01–初见C语言
    1. 1.0.1. 常见函数
    2. 1.0.2. 使用VS2015创建项目
    3. 1.0.3. 第一个程序
      1. 1.0.3.1. 程序分析
    4. 1.0.4. C语言关键字
    5. 1.0.5. C语言保留标识符
    6. 1.0.6. C语言数据类型
    7. 1.0.7. C语言输入输出函数
      1. 1.0.7.0.1. 示例:输入输出字符串
  2. 1.0.8. C语言命名规则
  3. 1.0.9. C语言运算符
    1. 1.0.9.1. 算术运算符
    2. 1.0.9.2. 关系运算符
    3. 1.0.9.3. 逻辑运算符
    4. 1.0.9.4. 位运算符
    5. 1.0.9.5. 赋值运算符
    6. 1.0.9.6. 其他运算符
    7. 1.0.9.7. 运算符优先级
  • 1.1. 参考资料
  • C语言基础01–初见C语言

    常见函数

    默认情况下,main函数是C语言的起点

    printf()函数是格式化输出函数 (来自stdio.h)

    单行注释:/ 单行内容 /

    多行注释:/* 多行内容 */

    使用VS2015创建项目

    1. 新建项目
    2. 依次选择vc++ ,win32 ,win32控制台程序
    3. 随便写个项目名称
    4. 应用程序向导里选择空项目,其他默认
    5. 从源文件添加新建项,创建.c文件
    6. 开始写代码

    第一个程序

    1
    2
    3
    4
    5
    6
    #include<stdio.h>

    int main() {
    printf("hello world!\n");
    return 0;
    }

    程序分析

    vs2015反汇编代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include<stdio.h>
    int main() {

    ;前面这块用于保障程序稳定性,把栈抬高,然后可以随便弄,弄完再把栈还原,再把寄存器的值还原
    ;将ebp存起来,然后把栈抬高0C0H位
    00C41760 push ebp
    00C41761 mov ebp,esp
    00C41763 sub esp,0C0h

    ;把ebx,esi,edi入栈
    00C41769 push ebx
    00C4176A push esi
    00C4176B push edi

    ;把栈抬高的位置放到edi,然后从edi刷CCCCCCCCh
    00C4176C lea edi,[ebp-0C0h]
    00C41772 mov ecx,30h
    00C41777 mov eax,0CCCCCCCCh
    00C4177C rep stos dword ptr es:[edi]

    ;这里是直接把字符串push进去,然后调用printf,然后平栈
    printf("hello world!\n");
    00C4177E push offset string "hello world!\n" (0C46BD0h)
    00C41783 call _printf (0C41316h)
    00C41788 add esp,4


    return 0;
    ;等价于eax清零,比mov eax ,0效率高
    00C4178B xor eax,eax
    }

    ;把edi,esi,ebx取出来
    00C4178D pop edi
    00C4178E pop esi
    00C4178F pop ebx

    ;把栈放回去
    00C41790 add esp,0C0h

    ;比较一下栈是否还在原来的位置
    00C41796 cmp ebp,esp
    00C41798 call __RTC_CheckEsp (0C4110Eh)
    ;还原esp和ebp
    00C4179D mov esp,ebp
    00C4179F pop ebp
    ;函数执行结束
    00C417A0 ret

    先把栈抬高,清空,用完再还原,可以实现不影响以前的栈

    C语言关键字

    image-20200515130659045

    C语言保留标识符

    1. 下划线开始的标识符
    2. 标准库函数名

    C语言数据类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include<stdio.h>
    #include<stdbool.h>
    //C99之前没有布尔类型,要用需要通过typedef的方式自己构造
    int main(){
    //int家族
    short num0; //2字节
    int num1; //4字节
    long num2; //8字节,大部分情况下 long = int 都是4字节
    long long num3;
    unsigned short num4; // 无符号短整型
    unsigned int num5;
    unsigned long num6;

    //字符
    char ctmp = 'A'; //此处需要用单引号,双引号是字符串

    //浮点型,存小数,也支持科学技术法
    float f1;//32位
    double f2;//64位
    long double f3;//128位

    //bool
    bool ff = true;//1
    bool ft = false;//0

    //指针
    char * pch;

    //union联合体
    //struct结构体
    //enum枚举

    return 0;
    }

    C语言输入输出函数

    输入函数:scanf(“%?”,temp);

    输出函数:printf(“%?”,temp);

    示例:输入输出字符串
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<stdio.h>

    int main() {
    int len = 0;
    char str1[20];
    scanf("%s", str1);
    len = strlen(str1);
    printf("hello world:%s,long:%d",str1,len);
    return 0;
    }

    默认情况下scanf被禁用了,因为存在安全问题,需要包含一个宏才能用:

    1. 项目–属性–C/C++–预处理器–编辑
    2. 把报错里说的宏复制进去

    C语言命名规则

    • 由字母,数字,下划线组成

    • 只能以字符和下划线开头,不能用数字开头

    • 匈牙利命名法:变量名前+属性+类型

    • 下划线划分

    • 大驼峰命名:所有单词首字母大写

    • 小驼峰命名:第一个单词首字母小写,其他首字母大写

    C语言运算符

    算术运算符

    image-20200515140054237

    关系运算符

    image-20200515140505452

    逻辑运算符

    image-20200515140907257

    位运算符

    image-20200515141019708

    赋值运算符

    image-20200515141156271

    其他运算符

    image-20200515141442250

    运算符优先级

    https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611#3

    参考资料