Bootstrap

## 学习笔记day02-Linux_gcc编译、C语言基础

学习笔记day02-Linux_gcc编译、C语言基础

1.gcc编译器

1)编译文件,文件编译成功,默认生成可执行文件:a.outgcc 文件名  
    
2)执行可执行文件:./a.out  ./可执行文件名  
    
3)直接更改可执行文件名:gcc xx.c -o 可执行文件名
    
4)gcc编译具体流程:预处理、编译、汇编、链接
    
5)预处理(展开头文件、宏定义替换、删除注释):gcc -E hello.c -o hello.i
    
6)编译(检查语法错误,将文件编译生成汇编文件):gcc -S hello.i -o hello.s
    
7)汇编(将汇编文件输出生成机器语言-二进制文件):gcc -c hello.s -o hello.o
    
8)链接(将二进制文件链接到库,生成可执行文件):gcc hello.o -o 可执行文件名/a.out

gcc -o a.out hello.c是编译hello.c生成二级制可执行文件a.out

2.C语言基础

(1)计算机基本结构

​ 存储器、运算器、控制器、输入设备、输出设备

​ 1)存储器

​ 内存:RAM,存放程序正在运行的代码及其数据,存放运算后的结果

​ 外存:固态硬盘,机械硬盘,光盘,USB驱动器,存放计算机中需要长期存储的代码及数据,当需要时再加载到内存中

​ 寄存器:位于中央处理器CPU内部的存储单元,CPU直接访问数据

​ 2)运算器:负责算术运算等操作

​ 3)控制器:读取指令,并控制计算机其他部件执行指令

​ 4)输入设备:键盘、鼠标、麦克风等

​ 5)输出设备:显示器、扬声器、打印机等

(2)程序

​ 程序就是系统可以识别的指令,存储在磁盘中,被加载到内存中运行

(3)计算机的数据表示
1.数值数据:
二进制八进制十进制十六进制
基数281016
位权2^n-18^n-110^n-116^n-1
取值范围0、10~70~909、af
示例0b00100777950x12a3
2.进制间的相互转换:
十转二八转二十六转二
1007770x12a1
10100b111 111 1110b0001 0010 1010 0001
3.非数值数据:
	linux下的帮助文档
       1   可执行程序或 shell 命令
       2   系统调用(内核提供的函数)
       3   库调用(程序库中的函数)
       4   特殊文件(通常位于 /dev)
       5   File formats and conventions, e.g. /etc/passwd
       6   游戏
       7   杂项(包括宏包和规范,如 man(7)groff(7))
       8   系统管理命令(通常只针对 root 用户)
       9   内核例程 [非标准
    man man
    man ls
    man 1 ls
    man 3 printf
    man ascii
    q 退出帮助文档
4.ASCII码表(常见):
‘\0’‘\n’’ ’‘0’‘A’‘a’
01032486597
5.printf:
printf("hello world\n");
"":中表示格式控制字符串,会被完全打印显示在终端上
格式控制符
    %d 打印显示有符号的整形数据
    %o 八进制
    %x 十六进制
    %#o 带前缀(0)的八进制
    %#x 带前缀(0x)的十六进制

补充: 原、反、补码(负数在计算机中以补码形式存放)

​ 正数:原、反、补码都相同

​ 负数:反码–除符号位,其他按位取反

​ 补码–反码加1(原码除符号位与末位不变,其他取反)

(4)词法符号
1.关键字
1)数据类型:char short int long float double  62)存储类型:unsigned signed auto register static extern const volatile  83)语法:if else switch case do while for default break continue goto return  124)构造:struct union enum  35)求字节:sizeof
6)取别名:typedef
7)空类型:void
2.标识符

(程序员自定义,但必须满足三条命名规则,标识符大小写敏感)

​ 1)只能由数字、字母、下划线组成

​ 2)不能由数字开头

​ 3)不能与关键字重名

3.运算符
1)算术运算符 + - * / %
	取余%:两边操作必须为整形

2)关系运算符 > < >= <= == !=
	表达式为真,输出结果为1
	表达式为假,输出结果为0
    
3)逻辑运算符 && || !	
    (表达式1&&(表达式2)只要有表达式为假,输出结果为假
    (表达式1||(表达式2)只要有表达式为真,输出结果为真
	短路法则:
		||:如果表达式1为真,则不执行表达式2
		&&:如果表达式1为假,则不执行表达式2
    
4)位运算符 & | ~ ^ << >>
    |:按位取或
    &:按位取与
    ~:按位取反
    ^:异或,相同为0,不同为1
        (a ^ b) ^ b=a
        (a ^ b) ^ c=a ^ (b ^ c)
    
    无符号:(左移低位补0,右移高位补0<<:左移运算符  0000 1010 << 2 --> (10->40)
                  0010 1000
    >>:右移运算符  0000 1010 >> 2 --> (10->2)
                  0000 0010
    
    有符号:(左移高位补符号位,低位补0<<:左移运算符  -5 << 3 --> -40
    >>:右移运算符  -5 >> 3 --> -1
    
5)赋值运算符 = += -= *= /= >>= <<=
    a*= 10 + 20
    a = a + 10 + 20//error
    a = a + (10 + 20)//right
    
6)递增递减运算符 ++ --
    a++ ++a(自增1)
    b = a++;//先赋值,后加1
	b = ++a;//先加1,后赋值++取的是内存中的值,后++取的是寄存器中的值
       eg:
	int a = 3;
	printf("%d %d %d %d %d\n",++a,a++,a,a++,++a);
	结果为:7 5 7 4 7
        
	函数中参数的执行顺序是从右向左
    ++a、--a、a取的都是内存中的值(该程序结束后内存中保存的值)
    a++、a-- 取的是寄存器中的值

7)地址运算符 &
    
8)逗号运算符 ,
    (表达式1,表达式2,表达式3,表达式4)
    从表达式1到表达式4依次向右执行,整体表达式结果为表达式4的结果
    
9sizeof运算符
   sizeof(int) 求数据类型的大小
        数据类型、变量名
    printf("char:  %ld\n", sizeof(char));
    printf("short: %ld\n", sizeof(short));
    printf("int:   %ld\n", sizeof(a));

10)条件运算符(三目运算符) ? :
	(表达式1)?(表达式2):(表达式3)
	先判断表达式1是否为真
        如果为真,则执行表达式2
        如果为假,则执行表达式3
    eg:
	int b = 0;
    b = (3 < 4) ? (a = 10) : 4;
    printf("a = %d\n", a);
    printf("b = %d\n", b);
	结果:a = 10
         b = 10
4.分隔符

​ 空格 tab键 回车

5.标点符号
, ; : '' "" {} []
6.C语言规范
#include <stdio.h>					//.h文件 头文件

int main(int argc, char *argv[])	//main主函数,程序入口函数,只能有一个
{ 
	代码块;						  //功能代码
    return 0;						//return 0,程序正常结束
    								//return -1,程序异常结束
} 

{}:代表一个单独模块
; 代表语句的结束

注释:
    // --> 注释一行
    
    /*
    	注释多行
    	
    */  
6.运算符优先级

在这里插入图片描述

(5)数据类型
类型字节范围
字符型:char18位-128~127
unsigned char18位0~255
短整型:short216位-32768 ~ 32767
unsigned short216位-32768 ~ 32767
整型:int432位0 ~ 65535
长整型:long4/832/64位-2^(n-1) ~ 2^(n-1) - 1
单精度浮点型:float432位精确到小数点6~7位
双精度浮点型:double864位精确到小数点后15~16位
;