学习笔记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.数值数据:
二进制 | 八进制 | 十进制 | 十六进制 | |
---|---|---|---|---|
基数 | 2 | 8 | 10 | 16 |
位权 | 2^n-1 | 8^n-1 | 10^n-1 | 16^n-1 |
取值范围 | 0、1 | 0~7 | 0~9 | 09、af |
示例 | 0b0010 | 0777 | 95 | 0x12a3 |
2.进制间的相互转换:
十转二 | 八转二 | 十六转二 |
---|---|---|
10 | 0777 | 0x12a1 |
1010 | 0b111 111 111 | 0b0001 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’ |
---|---|---|---|---|---|
0 | 10 | 32 | 48 | 65 | 97 |
5.printf:
printf("hello world\n");
"":中表示格式控制字符串,会被完全打印显示在终端上
格式控制符
%d 打印显示有符号的整形数据
%o 八进制
%x 十六进制
%#o 带前缀(0)的八进制
%#x 带前缀(0x)的十六进制
补充: 原、反、补码(负数在计算机中以补码形式存放)
正数:原、反、补码都相同
负数:反码–除符号位,其他按位取反
补码–反码加1(原码除符号位与末位不变,其他取反)
(4)词法符号
1.关键字
1)数据类型:char short int long float double 6个
2)存储类型:unsigned signed auto register static extern const volatile 8个
3)语法:if else switch case do while for default break continue goto return 12个
4)构造:struct union enum 3个
5)求字节: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的结果
9)sizeof运算符
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)数据类型
类型 | 字节 | 度 | 范围 |
---|---|---|---|
字符型:char | 1 | 8位 | -128~127 |
unsigned char | 1 | 8位 | 0~255 |
短整型:short | 2 | 16位 | -32768 ~ 32767 |
unsigned short | 2 | 16位 | -32768 ~ 32767 |
整型:int | 4 | 32位 | 0 ~ 65535 |
长整型:long | 4/8 | 32/64位 | -2^(n-1) ~ 2^(n-1) - 1 |
单精度浮点型:float | 4 | 32位 | 精确到小数点6~7位 |
双精度浮点型:double | 8 | 64位 | 精确到小数点后15~16位 |