一,进制转换
1.1 进位计数制
1.十进制(Decimal):基数是10,由0到9十个数字组成,逢十进一。
2.二进制(Binary):基数是2,由0到1两个数字组成,逢二进一。
3.八进制(Octal):基数是8,由0到8八个数字组成,逢八进一。
4.十六进制(Hexadecimal):基数是16,由0到9十个数字和A,B,C,D,E,F(或者小写字母)十六个字母组成,逢十六进一。
1.2 进制的脚标(两种)和前缀
二进制:(101)2或者101B
八进制:(72)8或者72O
十进制:(398)10或者398D
十六进制: (123)16或者123H
1.0B 表示二进制的前缀 这个它是以ob开头后面的数字都是二进制数 即:全部都是0和1
例如:0B10101010111
2.0O(O 大写英文字母O) 表示八进制的前缀 也可以使用空格加上0 注意是空格加上0 即:" 0"
例如 在chrome中按F12 在console控制台中可以输入字符串 " 076" 或者输入 "0O76" 查看结果是 62
3. 十进制的后缀 大家常见的数字不就是十进制数吗 怎么想的
没有前缀也没有后缀 就是数字表示多少就是多少
4.0x 这个是十六进制的前缀 123456789ABCDEF (A:10 C:12 F:15)
0x是16进制的前缀,H是16进制的后缀
都是表示十六进制数,意义上没有什么区别,完全相等。至于什么时候用0x,什么时候用H,
这取决于你在什么环境下使用,如果在C/C++/C#,必须用0x来表示。
在C/C#语言中是不能用H的.
1.3按权展开式
3 6 5
3*100 + 6*10 + 5*1
按权展开式——————> 3*10^2 + 6*10^1 + 5*10^0
在十进制数中,百位、十位、个位、十分位的权分别是10的2次方、10的1次方、10的0次方、10的-1次方。在二进制数中,位权则是2的n次幂。
1.写上标(个位为0,左增右减) 2.用每一位数乘以每一位数基数上标次幂
1.4非十进制转化为十进制
方法:将数的各位按权展开后求和
1.5十进制转非十进制
方法:整数:转几除几,倒取余。小数:转几乘几,正取整
(23)10=( )2
2 | 23
2 | 11 ......1
2 | 5 ........1
2 | 2 ........1
2 | 1 .......0
.........1
当短除号里面的数比外面的数大时,之后从下往上取余数就是10111
二进制与八进制
二进制转换为八进制:3位二进制表示1位八进制。用421法则
例:把二进制10101.01转化为八进制 是25.2
方法:1.分租:3位一组,不足三位补0
2.写上标:421
3.组内求和
八进制转换为二进制:拼凑法,一位八进制用三位二进制拼凑
例:76.43Q= B 答案是111110.100011
二进制与十六进制转换:4位二进制表示1位十六进制,用8421法。
例:10111101.01B= H 答案是BD.4
二,字符在计算机内部的表示
字符在计算机内部以ASCLL码表示。
整型在计算机内部以补码表示
ASCLL码:美国信息交换标准码,采用7位二进制编码,扩展的是8位
0000000------1111111所以ASCLL码的范围是0--127 一共128个字符
大写字母:A-65,B-66......Z-90 大写转小写:大写ASCLL+32=小写ASCLL
小写字母:a-97,b-98......z-122 小写转大写:小写ASCLL-32=大写ASCLL
数字字符:0-48,1-49......9-57
控制符:空格(space) 32 33个
标点符号: 33个
一个汉字占2个字节,一个字符占一个字节,1个字节是8位二进制数
一个汉字有机内码,国标码等等,但都是两个字节
第一章 程序设计的基本概念
1.1程序
1.由高级语言编写的程序称为源程序
2.C语言是用途广泛,功能强大,使用灵活的过程性语言,既可用于编写应用软件,也可以编写系统软件
3.C语言属于高级语言,其编写的程序扩展名为.c,经过编译后生成的文件扩展名,obj,经过链接后生成的文件扩展名为.exe
C源程序--编译--->目标程序---链接--->可执行程序
a.c a.obj a.exe
4.C语言源程序的执行过程为编译和链接
1.2 结构化程序设计
C语言是一种结构化的程序设计语言,它提供了三种基本结构语句,结构化程序通常由三种基本结构组成,包括顺序结构,选择结构,循环结构。
第二章 C程序设计的初步认识
2.1 简单的C程序
#include <stdio.h>/*这是编译预处理命令*/
main(){//定义主函数,返回类型不写就按默认int
int a,b,s; //函数首部(函数头)+函数体
a=123;b=456; //一共5个语句
s=a+b;
printf("%d\n",s);
}
主函数main只能有一个
注释作用:增加程序的可读性,注释可以插到程序中任何地方,对程序的执行没有任何影响,编译时将被过滤过
多行注释/块注释:/**/ 单行注释://
C语言源程序由若干个函数组成,函数是组成C程序的基本单位。
一个函数包括两个部分:函数首部和函数体。
函数体一般包括两个部分:定义和执行部分。
一个C语言源程序总是由主函数开始执行,由主函数结束,且主函数的位置是任意的并且C程序中有且只有一个主函数。
语句是组成C程序的最小单位
每条语句末尾加上;作为语句的结束。
一行可写一条或者多条语句,一条语句也可写成一行或多行。
C语言程序必须至少有一对{},代表程序的开始,结束,里面的内容称之为函数体
2.2 C语言标识符
1.标识符的组成
标识符由数字,字母,下划线组成,开头只能是字母或者下划线
2.标识符的分类
关键字:32个 例:int
预定义标识符:scanf,printf,include,define
用户标识符:比如变量名
关键字不能用作用户标识符,预定义标识符不建议
关键字均为小写字母
标识符区分大小写
常见的基本数据类型包括整型,实型,字符型
常量:在程序运行中不可改变的量。变量:在程序运行中,值可以改变的量
实型:0.123,-4.56
2.3 整型数据
整型常量只有十进制,八进制,十六进制,唯独没有二进制。八进制:024,072前导0.十六进制:0x123,0Xabc,前导0x或者0X
注意:printf("%o",12);输出无前导所以输出的不是014,而是14
整型变量 int在TC系统占2个字节,在VC系统下占4个字节。如果没说按照天软默认TC
ANSI标准定义int是占2个字节,TC是按ANSI标准的,它的int是占2个字节的。但是在VC里,一个int是占4个字节的
short =short int都是短整型,占2个字节
long=long int 长整型 占4个字节 unsigned int 无符号整型
多个类型相同的变量:数据类型 变量名, 变量名, 变量名…;
未赋值的变量默认为随机值
2.4 实型数据
1. 实型常量:(1)小数点式:由数字,正负号,小数点组成。规则:必须有小数点,而且小数点至少一边是有数字的。如:.2,6.,0.15
(2)指数形式:由E或e组成。例:12.34E+2=>12.34*10^(+2),12.34e-2=>12.34*10^(-2)。规则:两边都要有数字,指数部分必须是整数(e/E右边为整数)
2.实型变量:单精度:float 占4个字节 双精度:double 占8个字节
注意:实型常量没在特殊说明下默认为double型
对于字面常量(如数字、字符或字符串),C语言编译器会根据字面常量的值和上下文来确定其类型。
注意:%f输出默认保留6位小数,不足6位补零,超过6位四舍五入
%.2f
会打印出小数点后两位。你也可以指定字段的最小宽度。如果数值的宽度小于这个值,那么它会在左侧用空格填充(除非指定了左对齐)。例如,%10.2f
会打印出一个至少宽为10的字段,小数点后有两位。默认情况下,数值是右对齐的。但是,你可以通过在前缀中加入-
来使其左对齐。例如,%-10.2f
IEEE 754 double
类型通常可以保证大约 15-17 位十进制有效数字的精度。
2.5 字符数据
一,字符常量
1.常规字符常量
'a','6','A' 注:单引号括起一个字符
2.转义字符常量"(7+2 七个基本+两个扩展) 转义字符字符常量也占1个字符
'\n'-换行 '\t' 横向跳格 每行有十个显示区,每个区为8列'\t'的作用就是跳到下一个显示区
'\b'左移覆盖 printf("123456\b");这句话应该是6被覆盖但是\b后面没有东西,所以还是123456
'\r'-回车:光标回到行首,并不换行
'\\'--反斜杠 '\''--单引号 '\'''--双引号
'\ddd':1到3位八进制数表示的1个字符 例:'\101' 十进制就是65
'\xhh':1到2位十六进制整数表示的1个字符
3,字符串常量
"ABCD" 注意:双引号括起来多个字符
字符串要有\0作为字符串结束的标志
所以"ABCD\0"是五个字节 '\0'是0不是字符0
'\072'有\优先看是不是特殊的转义字符,是'\ddd'类型的,所以是是占一个字符
在C语言中,如果一个字符串常量没有包含任何字符(即两个连续的引号之间没有任何字符),如 ""
,那么它仍然包含一个终止的空字符(\0
)来标识字符串的结束。这个字符串占用的字节数是1个:仅仅用于表示字符串结束的\0
字符
二,字符变量
char 占一个字节
%c 输出字符格式
char c1='A',c2=100;
printf("%d,%c\n",c1,c2);
c1=c1+32;c2=c2-32;
字符+x(整型常量)=字符先后移动x位
字符-字符=字符间的距离差
2.6 算术表达式
一,基本算术运算符
+,-,*,/,%
a/b 若a与b都为整型,结果为整型只取整数部分,若a与b其中任意一个位实型,结果为实型
% 取余
7%3=1,7%-3=1,-7%3=-1,-7%-3=-1,
出现负数,余数的符号与被除数一致(与%左边的数一致)。
取余运算符的对象必须是整型。
二,运算符的优先性与结合性
1.优先级:次序
()>*,/,%>+(加),- (减)
2.结合性:方向
(),*,/,%,+(加),-(减):自左向右
三,数据类型转换
如果将实型小数赋值给整型变量,那么整型变量只接受小数的整数部分
转换类型分为隐式(自动)转换和强制转换
隐式转换:一般是从低字节到高字节,比如一个字符整型按照%d输出
强制转换:有高字节到低字节
格式:(类型名)表达式
强制转换并不会对它的值发生改变,只有给它再赋新值才能改变它的值
2.7 赋值表达式
一,赋值运算符
= 优先级:仅高于逗号运算符 结合性:自右向左 形式:变量名=表达式
二,复合赋值表达式
+=,-=,*=,/=,%= 优先级:仅高于逗号表达式 结合性:自右向左
2.8 自加自减运算符和逗号运算符
一,自加自减运算符
形式:++变量,变量++,--变量,变量--
注意:自加自减的运算对象必须是变量
二,逗号表达式
形式:表达式1,表达式2,......,表达式n
说明:自左向右顺序求值,将表达式n的值作为整个逗号表达式的值 优先级:最低 结合性:自左向右
第三章 顺序结构
3.1 赋值语句
在赋值表达式的后面加上分号就构成了赋值语句
++(i+1);不是正确的赋值语句,+
是一个二元运算符,它的优先级高于一元运算符++,++运算符是用于变量的
++i,j++;都是赋值语句
int x=y=z=10;
这种形式的赋值语句是不正确的,但在C语言中,你不能在一个声明中连续地给多个变量赋值。
3.2 数据的输出
printf("字符格式说明 转义字符",输出项.......);
注意:格式符的个数要与变量、常量或者表达式的个数一一对应
如果把一个实型小数放到一个整型变量中,那么整型变量只能接收整数部分,但是如果将一个实型小数按照%d整型打印那就涉及到位运算了
字符原样输出
指定宽度输出
整型
int a=1234;printf("a=%5d\n",a);printf("a=%2d\n",a); 输出结果:a= 1234;a=1234;
%md m-代表指定宽度 实际<m---左边补空格,实际>m---原样输出
实型
int f=24.3567;printf("a=%8.3f\n",a);printf("a=%10.5f\n",a); 输出结果:f= 24.357;f= 24.35670;
%m.nf m-代表数据总长度,n代表小数位数 实际>n--四舍五入 实际<n--补零
如果输出项大于输出格式,多余的项不输出
因此,-32768并不是“违反定义”的特殊数值,而是补码系统为了处理溢出和简化有符号整数加减运算而特别定义的一个数值。它的存在确保了补码系统能够正确地处理所有可能的整数加减运算,并且在上溢和下溢时产生有效的结果
在补码系统中,我们通常通过找到一个正数,取其补码(即取反加1)来得到对应的负数。但是,没有哪个正数取反加1之后会变成1000 0000 0000 0000
(这是16位二进制数,表示-32768
3.3 数据的输入
scanf(“输入格式”,地址) &取地址运算符
整型数据输入如果没有其他符号分隔,用空格,或回车分隔,scanf它会读取该非空白字符开始的一个整数,直到遇到下一个空白字符或无法识别为整数的一部分的字符为止。
scanf函数通常以空格(包括制表符和换行符)作为输入字段的分隔符,如果输入中包含多个连续的非空白字符,并且格式字符串只指定了一个读取项(如上面的例子),那么 scanf
只会读取并处理第一个项,忽略后面的字符
getchar
函数则不同。它会逐个字符地读取输入,直到遇到文件结束符(EOF)或发生错误,
当使用 scanf
时,输入的字符首先被存储在输入缓冲区中。scanf
会根据格式字符串从缓冲区中读取字符,并跳过空白字符。如果缓冲区中还有剩余的字符(包括空白字符),这些字符将保留在缓冲区中,直到下一次输入操作,getchar
也是从输入缓冲区中读取字符。但是,由于它逐个字符地读取,因此它不会跳过任何字符(包括空白字符)
字符的原样的输入 int a,b;scanf("a=%d,b=%d",&a,&b);printf("%d,%d\n",a,b);
指定输入数据的宽度 int a,b;scanf("%2d%2d",&a,&b);printf("%d,%d",a,b);运行时输入12345,则输出结果是1234 注意:输入宽度不得少于指定宽度
应该指定宽度后它只按宽度取值不需要空格,也可以使用空格
实型数据的输入 注意:输入不能规定小数点后的位数,输出可以规定小数点后的位数
字符的输入和输出
char c1,c2;scanf("%c%c"&c1,&c2);printf("%c,%c\n",c1,c2);c只能拿一个字符,不用加空格,如果加空格,空格就被拿走了
char c;c=getchar(); char a='A';putchar(a);putchar('B');
3.4 复合语句与空语句
一,复合语句
形式:{a=2;b=3;c=a+b;} 把多个语句变成一个复合语句
二,空语句
形式: ;一个空语句
3.5 程序实例
输入两个整数x,y,将其值交换后输出
int a,b;scanf("%d%d",&a,&b);a=a+b;b=a-b;a=a-b;
第四章 选择结构
4.1 关系运算与逻辑运算
C语言中的逻辑值:c语言将非0值当作真(1),0值当作假(0)
一,关系运算
1.关系运算符 >,>=,<,<=,==,!= 优先性:前四者高与后两者 结合性:自左往右比较
2.关系表达式成立就是1,不成立就是0
二,逻辑运算
1,逻辑运算符 !(非),&&(与),||(或) 优先性:!>&&>|| 结合性:!自右向左,&&,||自左向右
2,逻辑表达式 &&条件同时满足为真,||只满足一个条件就为真
3,短路运算 int a=1,b=2,c=3; 执行表达式(a>b)&&(c=1)后c的值是3
一个赋值语句的返回值就是被赋值变量的值
&&优先级较高,先接和,从左向右计算
4.2 if语句
一,单分支语句
形式:if (condition) {
// 执行代码块
}
二,双分支语句
形式:if (condition1) {
// 如果条件1为真,执行这个代码块
}
else {
// 如果所有条件都不为真,执行这个代码块
}
三,多分支语句
形式:if (condition1) {
// 如果条件1为真,执行这个代码块
} else if (condition2) {
// 如果条件1为假但条件2为真,执行这个代码块
} else if (condition3) {
// 如果条件1和条件2都为假但条件3为真,执行这个代码块
}
// ... 可以有更多的 else if 子句 ...
else {
// 如果所有条件都不为真,执行这个代码块
}
4.3 条件运算符(三目运算符)
形式:条件?表达式1:表达式2
如果条件为真结果为表达式1的结果,如果条件为假结果为表达式2的及结果
优先级:仅高于赋值与逗号 结合性:自右向左
4.4 switch语句
switch (expression) {
case constant1:
// 当 expression 的值等于 constant1 时执行的代码块
break;
case constant2:
// 当 expression 的值等于 constant2 时执行的代码块
break;
// ... 可以有更多的 case 语句 ...
default:
// 当 expression 的值不等于任何 case 常量时执行的代码块
break;
}
case
标签后的值必须是常量表达式,不能是变量或非常量表达式
每个case
后面通常应该有一个break
语句,以防止case穿透。
default
标签通常是可选的,但如果没有其他case
与expression
的值匹配,并且没有default
,那么switch
语句将不会执行任何操作。
如果expression
的类型不是整数或枚举类型,编译器会报错。
第五章 循环结构
5.1 while 语句
形式:while(条件) 语句;
5.2 do-while 语句
do 语句;
while(条件);
do-while语句最少执行一次
5.3 for 语句
形式:for(初值;条件;增值)语句;
变量定义能不能放在for循环中的表达式1中,这个由c语言的标准来决定的,所以把变量定义放在for循环外面
5.4 break与continue
break 形式:break; 功能:跳出终止当前的循环
continue 形式:continue; 功能:结束本次循环开始下一次循环
5.5 循环中的嵌套
第六章 函数
6.1 函数的定义与返回值
6.2 函数的调用
6.3 函数之间的值传递
第七章 数组
7.1 一维数组
形式:类型说明符 数组名[常量表达式];中括号里是整型变量或整型常量表达式比如(5+5)
引用:必须先定义,后使用,数组名[下标]
数组的完全初始化
数组的不完全初始化
未赋值的元素默认为0
7.2 二维数组
形式:类型说明符 数组名[常量表达式][常量表达式];
二维数组的引用:数组名[下标][下标]
二维数组初始化可以省略行下标,不可以省略列下标
第八章 指针
8.1 指针与变量
一 指针概念
指针即地址 变量的指针就是变量的地址
二,指针的定义
形式:基类型 *指针变量名 *是指针说明符(说明后面的变量是指针变量)
三,指针的赋值
通过取地址运算符给指针变量赋值:&
int x,*p; p=&x;
四,空指针
int *p=NULL; NULL表示空,其值为0。
空指针定义后不能引用
五,指针的操作
&:取地址运算符 *:取内容运算符(在定义语句里是指针说明符)
*&a==a
在表达式 x = *p * *q;
中,*p
和 *q
会首先被解引用以获取它们所指向的值,然后这两个值会相乘
取内容运算符的优先级>算术运算符
8.2 指针与一维数组
数组名即一维数组的首地址,第0个元素的地址
注意:数组名是地址常量,不可以赋值,指针是变量,可以赋值
可以使用数组名来进行指针算术,并且它会被解释为指向数组首元素的指针。
指针是可以比较大小的,谁靠后谁就大,指针可以相减,就是之间相差元素的个数,指针不可以相加
8.3 指针与二维数组
一,二维数组的地址
例如:int a[3][4]; 说明:a是二维数组名,即二维数组的首地址,第0行的地址
*(a+1)+2:第一行第二列的地址
*((a+2)+3):第二行第三列的内容
a[1]+2:第1行第2列的地址
*(a[2]+3):第2列第3列的内容
8.4 数组指针
int (*p)[4] 说明:p为类型为int型数组的指针。含义:一个指向M个整型元素的一维数组指针
int *p[4]
8.5 指针数组
int *q[3];说明:q是由三个指针变量构成的数组,简称指针数组。q[0],q[1],q[2]均为int *
每一个元素都是一个指针,每个元素都是地址
8.6 函数指针
int (*p)();说明:p是返回值为整型函数的指针
p是一个指针名,该函数返回一个int型数据
8.7 指针函数
int *p();说明:平时返回值为整型指针的函数,p是函数名,该函数返回一个int型指针