C语言基础
一 、c语言基础
1、计算机存储单位:
位:bit
字节:byte/B
单位转换:一字节=八位
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
2、计算机数据的表示形式:
数值型数据:能够进行算数运算得到明确数值概念的信息称为计算机数值数据,其余信息称为非数值型数据。
基数:是指该进位制中允许选用的基本数码的个数。
位权:是以基数为底,数字所在位置的序号为指数的整数次幂。
0b--二进制(BIN):(2)0、1 (逢二进位)
d--十进制(DEC):(10)0、1、2、3、4、5、6、7、8、9
0/O-八进制(OCT):(8)0、1、2、3、4、5、6、7
0x--十六进制(HEX):(16)0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
2.1进制转换:
1)十进制转二进制:
短除法:除二倒取余
拆分法:拆分成2的几次方和(如:66=64+2;27=16+8+2+1)
计算器:程序员模式
2)二进制转十进制:
二次方和,从右向左依次增加(把所有有1的位加起来)
101100=4+8+32=44
3)八进制转二进制:
一位八进制是用三位二进制表示,以数字0/O开头。
031=011 001=26;0765=111 110 101=501
4)二进制转八进制:
从低位开始,三个二进制为一组便是一位的八进制,不够补0,使用421码。
100 100= 044
5)十六进制转二进制:
每一位十六进制用四位二进制表示,十六进制用0x开头,(可以使用8421码计算)
0xab=1010 1011;0x3ce=0011 1100 1110 (前面的0可以省略)
6)二进制转十六进制:
从低位开始,四个二进制位一组表示一个十六进制位,不够补0.
1100101010=0011 0010 1010=0x32a
2.2非数值型数据:ASCII码
终端中查看:man ASCII
常用ASCII码:
常用ASCII码 | ASCII码 | 作用 |
\0 | 0 | 一般作为作为字符串的结束标志 |
\n | 10 | 一般表示换行 |
空格/spack | 32 | 空格显示 |
0(字符零) | 48 | 字符0-48为数字0 |
9(字符九) | 57 | 字符型数字与数字型数字相差48 |
A | 65 | 大写字母+32为小写字母 |
Z | 90 | |
a | 97 | 小写字母-32为大写字母 |
z | 122 |
二、词法符号:
什么是词法符合:词法符号就是程序设置的时候在里面规定的一些由几个字符组成的一些简单的有意义的最小的语法单位。
关键字:由系统预定义的具有特殊功能的词法符号。
1、关键字分类:
1、存储类型:
常用:auto(自动的;可省略),static(静态),extern(外部引用)
register(),(const, volatile,用于修饰)
2、数据类型(有符号,无符号):
整型:char(字符型),short(短整型),int(普通整型),long(长整型)
实型:float(单精度浮点型),double(双精度浮点型),
signed(有符号型), unsigned(无符号型)
3、构造:union(共用体),struct(结构体),enum(枚举型)
4、选择结构:if ,else,switch,case,default
5、控制语句:for,while,do,goto,{break,continue}循环控制结构,return
6、其他:void(空类型),sizeof(计算数据空间所占大小),typedef(重定义)
volatile(防止编译器优化),return(函数返回值)
2、关键字功能:
- char :声明字符型变量或函数
- short :声明短整型变量或函数
- int :声明整型变量或函数
- long :声明长整型变量或函数
- float :声明浮点型变量或函数
- double :声明双精度变量或函数
- signed :声明有符号类型变量或函数
- unsigned :声明无符号类型变量或函数
- enum :声明枚举类型
- struct :声明结构体变量或函数
- union :声明联合数据类型
- void :声明函数无返回值或无参数,声明无类型指针
- if :条件语句肯定分支
- else :条件语句否定分支(与if连用)
- switch :用于分支语句
- case :开关语句分支
- default :开关语句中的“其他”分支
- for :一种循环语句(可意会不可言传)
- while :循环语句的循环条件
- do :循环语句的循环体
- goto :无条件跳转语句
- break :跳出当前循环
- continue :结束当前循环,开始下一轮循环
- return :子程序返回语句(可以带参数,也可不带参数)
- auto :声明自动变量,在栈区开辟空间,一般不使用
- static :声明静态变量
- extern :声明变量是在其他文件正声明(也可以看做是引用变量)
- register :声明寄存器变量,申请失败,默认转成auto类型
- const :修饰变量为只读变量
- volatile :修饰变量,读取最新的值(防止编译器优化;从内存读取最新的值)
- sizeof :计算数据类型占内存大小
- typedef :用以给数据类型取别名(当然还有其他作用)
3、标识符
命名规则:(如驼峰命名)
- 由数字、字母、下划线组成
- 不能数字开头
- 不能和关键字重复
- 需要见名知意
- 运算符
4.1算数运算符:+、-、*、/、%(取余)、++、--、
1)+、-、*与正常数学运算一致
2)“/”(除):整数小数不同
:整数相除向下取整 ,除号两边都是整数时,得到的也是整数(如:5/2=2)
:小数相除不会取整,除号两边有小数时,得到的是小数,不会取整
(如:5.0/2=2.500000)
3)“%”(取余):只能用于整数取余 (10%3=1)
例题:题将数字12345的个位十位百位千位万位用"/","%"分别表示出来;
4)“++”:
如果说想把它当作表达式的话,需要自加或自减的位置来判断运算的先后顺序,位置不一样,先后顺序也不一样。
int a=10
a++;//a++相当于a=a+1;
int a=a+2;可简化为a+=2
赋值运算:
(1)int b=a++;//b输出为10,此时a等于11,“++”在后,先赋值再自加。
(2)int b=++a;//b输出为11,此时a等于11,“++”在前,先自加再赋值。
打印语句:
printif("%d\n",a++);//输出10,先打印,再自加。
printif("%d\n",++a);//输出11,先自加,在打印。
独立成句:不赋值,不用考虑++位置前后
int a=3;
- a++;
printif("%d\n",a)//输出a=4
- ++a;
printif("%d\n",a)//输出a=4
- "--":同理“++”,只是自加变成自减,把a-1赋值给a,其他地方没有变化。
例题:
4.2逻辑运算符:
也就是看逻辑表达式是真的还是假的;1为真true;0为假false
1)&&(逻辑与):同真为真,一假则假;
2)||(逻辑或):同假为假,一真为真
3)!(逻辑非):非真即假,非假即真。
4)截断法则:
逻辑与运算中,如果前面的表达式为假,则后面的表达式不执行。
逻辑或运算中,如果前面的表达式为真,则后面的表达式不执行。
4.3位运算符:
位运算符指的是二进制里的每一位,指的是0和1,没有真假,因为不是一个逻辑上的判断真假。而是计算0和1通过这些个位运算符算出的结果到底是什么,按位进行的操作。
1)& (位与):全1则1,有0则0.
例:5&8=0101&1000=0000=0
2)| (位或):有1则1,全0则0.
例: 5|8=0101&1000=1101=13
3)^ (异或):不同为1,相同为0.
例:5^12=0101^1100=1001=9
4)~(取反):通过补码进行操作,按位取反,
正数 | 负数 | |
原码 | 本身 | 本身 |
反码 | 本身 | 除符号位其他位按位取反 |
补码 | 本身 | 负数反码加1 |
例:15:原码、反码、补码:0000 0000 0000 0000 0000 0000 0000 1111
~15取反15的补码为:1111 1111 1111 1111 1111 1111 1111 0000
反码:1111 1111 1111 1111 1111 1111 1110 1111
原码:1000 0000 0000 0000 0000 0000 0001 0000等于-16
例:-15:原码、反码、补码:1000 0000 0000 0000 0000 0000 0000 1111
~-15取反-15的补码为:0111 1111 1111 1111 1111 1111 1111 0000
反码:0111 1111 1111 1111 1111 1111 1110 1111
原码:0000 0000 0000 0000 0000 0000 0001 0000等于16
5)<<(左移):左移几位,右面补几个0,
例:8 补码;...1000;
8<<2(左移两位)....0010 0000 等于32
8<<3(左移三位)....0100 0000 等于64
例:-5原码1000....0101,-5反码:1111 .....1010,-5补码 1111 .....1011
-5<<3(左移三位):补码1111... 1111 1011 000
反码-1:1111 ....1010 11
取反:1000 ... 0101 000 等于-40
6)>>(右移):右移几位,在左边补几个符号位,
例:8:0000...0000 1000
8>>2(右移两位)000000...0000 1000
例:-48:源码1000 ...00011 0000;反码:1111 ... 1100 1111;补码:1111....1101 0000
-48>>3(右移两位): 补码 111 1111....1101 0000 反码:111 1111... 1100 1
源码:100 0000 .... 0011 等于-6