03 C基础(C语言概述)

C语言概述

基础组成

  • 关键字 32

    • 数据类型关键字
      • 基本数据类型(5个)
        • void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
        • char :字符型类型数据,属于整型数据的一种
        • int :整型数据,通常为编译器指定的机器字长
        • float :单精度浮点型数据,属于浮点数据的一种
        • double :双精度浮点型数据,属于浮点数据的一种
      • 类型修饰关键字(4个)
        • short :修饰int,短整型数据,可省略被修饰的int。
        • long :修饰int,长整形数据,可省略被修饰的int
        • signed :修饰整型数据,有符号数据类型
        • unsigned :修饰整型数据,无符号数据类型
      • 复杂类型关键字(5个)
        • struct :结构体声明
        • union :共用体声明
        • enum :枚举声明
        • typedef :声明类型别名
        • sizeof :得到特定类型或特定类型变量的大小
      • 存储级别关键字(6个)
        • auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配
        • static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
        • register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
        • extern :指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义
        • const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
        • volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
    • 流程控制关键字
      • 跳转结构(4个)
        • return :用在函数体中,返回特定值(或者是void值,即不返回值)
        • continue :结束当前循环,开始下一轮循环
        • break :跳出当前循环或switch结构
        • goto :无条件跳转语句
      • 分支结构(5个)
        • if :条件语句,后面不需要放分号
        • else :条件语句否定分支(与if连用)
        • switch :开关语句(多重分支语句)
        • case :开关语句中的分支标记
        • default :开关语句中的“其他”分支,可选。
      • 循环结构(3个)
        • for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2…循环,其中2为循环条件。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,也可能一次也不计算。循环体可能多次执行,也可能一次都不执行
        • do :do循环结构,do 1 while(2); 的执行顺序是1->2->1…循环,2为循环条件
        • while :while循环结构,while(1) 2; 的执行顺序是1->2->1…循环,1为循环条件
  • 控制值语句 9

    • 条件语句: if(…) … else …
    • 循环语句:
      • for(…) …
      • while(…) …
      • do … while(…) ; //注意do-while语句和while语句的区别,do-while语句while后有逗号而且至少执行一次
      • 多分支选择语句: switch
      • 跳转语句: goto
      • 函数返回语句: return
      • 结束本次循环: continue
      • 终止执行循环或switch: break
  • 运算符 34

    • () [] -> .(结构体成员运算符)
    • !(逻辑非) ~(按位非)
    • ++ – -(负号) (类型)(类型转换运算符) *(指针运算符)
    • &(地址运算符) sizeof *(乘法运算符) /(除法运算符) % + -(减法运算符)
    • << >> < <= > >= == !=
    • &(按位与) ^(按位异或) |(按位或) &&(逻辑与) ||(逻辑或)
    • ?: (条件运算符) =(赋值运算符) ,(逗号运算符)
    • =的扩展运算符:+= -= *= /= %= >>= <<= &= ^= |=

注意事项

  • Linux编译后的可执行程序只能在Linux运行,Windows编译后的程序只能在Windows下运行。
  • 64位的Linux编译后的程序只能在64位Linux下运行,32位Linux编译后的程序只能在32位的Linux运行。
  • 64位的Windows编译后的程序只能在64位Windows下运行,32位Windows编译后的程序可以在64位的Windows运行。

代码分析

  • include头文件
    • #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
    • 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
    • 可以通过man 3 printf查看printf所需的头文件
    • #include< > 与 #include ""的区别:
      • < > 表示系统直接按系统指定的目录检索
      • “” 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
  • main函数
    • 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
    • main函数是C语言程序的入口,程序是从main函数开始执行。
  • {} 括号,程序体和代码块
    • {}叫代码块,一个代码块内部可以有一条或者多条语句
    • C语言每句可执行代码都是";"分号结尾
    • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
    • 所有的可执行语句必须是在代码块里面
  • return语句
    • return代表函数执行完毕,返回return代表函数的终止
    • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
    • 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
    • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
  • system函数
    • #include <stdlib.h>
      int system(const char *command);
      功能:在已经运行的程序中执行另外一个外部程序
      参数:外部可执行程序名字
      返回值:
      成功:不同系统返回值不一样
      失败:通常是 - 1
    • C语言所有的库函数调用,只能保证语法是一致的,但不能保证执行结果是一致的,同样的库函数在不同的操作系统下执行结果可能是一样的,也可能是不一样的。

C语言编译过程

  • C程序编译步骤
    • 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
    • 编译:检查语法,将预处理后文件编译生成汇编文件
    • 汇编:将汇编文件生成目标文件(二进制文件)
    • 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
  • gcc编译过程
    • 分步编译
      • 预处理:gcc -E hello.c -o hello.i
        • -E 只进行预处理 .c C 语言文件
      • 编 译:gcc -S hello.i -o hello.s
        • -S(大写) 只进行预处理和编译;.i 预处理后的 C 语言文件
      • 汇 编:gcc -c hello.s -o hello.o
        • -c(小写) 只进行预处理、编译和汇编; .s 编译后的汇编文件
      • 链 接:gcc hello.o -o hello_elf
        • -o file 指定生成的输出文件名为 ; .o 编译后的目标文件file
    • 一步编译
      • gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程):

CPU内部结构与寄存器

  • 64位和32位系统区别
    • 寄存器是CPU内部最基本的存储单元
    • CPU对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU
    • 如果总线是32位,寄存器也是32位的,那么这个CPU就是32位CPU
    • 有一种CPU内部的寄存器是32位的,但总线是16位,准32位CPU
    • 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
    • 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
    • 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位
    • 64位的软件不能运行在32位的CPU之上
  • 寄存器名字(了解)
    • 8位: A B C D
    • 16位: AX BX CX DX
    • 32位: EAX EBX ECX EDX
    • 64位: RAX RBX RCX RDX
  • 寄存器、缓存、内存三者关系
    • CPU计算时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。于是 CPU<—>寄存器<—>内存,这就是它们之间的信息交换。
    • 那为什么有缓存呢?因为如果老是操作内存中的同一址地的数据,就会影响速度。于是就在寄存器与内存之间设置一个缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值