C语言复习
QAQ其实是要期末了 一则应付c语言1的产物,很简要很基础)
计算机语言:计算机和人都能识别的语言
机器语言 :直接识别和接受的二进制代码称为机器指令,机器指令的集合是机器语言。
符号语言 :需要汇编程序进行转换,一般是一对一,转换的过程称为“代真”或者“汇编”,故而也称汇编语言。不同型号的计算机之间不通用,也叫计算机低级语言。
高级语言 :不依赖机器,需要编译程序把源程序转换为目标程序,一般一句对多句机器指令。
高级语言的发展由非结构化的语言,到结构化语言(C语言),再到面向对象的语言(C++)。前两者是基于过程的语言。
程序设计
注释
//只有一行不能换行
/*从这里开始
可以很多行
到这里之内的都是注释*/文件后缀
源程序文件.c后缀,编译程序把源程序转换为二进制程序.obj后缀,最后与函数库相连接生成可执行程序.exe
程序=算法+数据结构
数据结构就是数据、数据的类型和数据的组织形式
算法就是对操作的描述
常量
整型常量 :1000、12345
实型常量 :第一种十进制的小数形式:0.0,12.0,12.345
第二种是指数形式:12.34e3或者12.34E3,e前面必须有数据(e3这种是不行的),e后面必须是整数
字符常量 :第一种普通字符,使用
‘'包裹的,里面只能有单个第二种转义字符,常用的是
\n,\r(回车,到本行开头),\t(水平制表符)第三中字符串常量
第四章符号常量 用
#define指令比如:#define PI 3.1415行末不写分号,习惯都大写。
这里的符号常量是预编译指令,只是进行字符替换,没有给名字分配存储单元
而常变量是有存储单元的,只是数值不改变 ;比如
const int a=3;
标识符
其实就是各种对象的名字,由字母,数字, 下划线 (.,#这些符号都不行)组成, 首位字符只能是字母或者下划线 ,与大小写有关,不能是关键字
数据类型
整型数据
只有正数值的可以这样定义 unsigned int ,这样范围会扩大,使用 %u 来输出,表示无符号的十进制。如果给无符号整型赋值负数会得到错误的数值。
实际上字符型数据也在整数类型里面,但是显然有不同的性质。整数1+1=2,在两个字符1相加就不一样了。但是它也可以用unsigned。使用 char 定义 ,%c 输出字符
浮点型数据
浮点型是以指数形式存储在存储单元的,其实是实数
C程序里面所有带小数点的都当作双精度处理了,分配八个字节,所以如果一定要赋给float常量,要这么写 float a=3.14159f 。同理 long double a=1.23L 但是visualC++里面这两种是一样的。
输入双精度型变量用 %lf
输出时候不止用了 %f ,比如前面加上7.2,这里说明要两位小数,而且不同行的小数点会对齐
运算符
运算符优先级
重要
非(!) > 算术 > 关系 > &&和|| > 赋值
算术运算符
对于除法,大多数c语言编译系统都选取向零取整的算法
优先级的说明:
1、先乘除后加减
2、算数运算符是左结合性,即从左到右算;赋值运算符则相反
混合运算:1.加减乘除运算,所有数都转换为double,所以结果都是double类型
2.字符型参与计算时,会把它的ASCII代码转换为double类型
3.大写字母加32变成对应的小写字母
强制转换运算符
格式为 (类型名字)(表达式)
表达式要被括起来,比如 (int)(x+y) ,(int)x+y 表达的不是一个意思
赋值运算符
特别的是 x*=y+8 和 x=x*(y+8) 是一个意思,即使前者没有括号
类型转换过程中,浮点数赋到整数会丢掉小数部分;double转float不能超过其最大范围
初始化时 int a,b,c=5; 代表着只为c赋初值
三个都要赋值应该这么写 int a=5,b=5,c=5;
如果 int a=b=c=5; 就不对了,初始化不是在编译阶段完成的,而是运行中多出一个赋值语句
关系运算符
其内部也有拆分,单个的(< > >= <=)的优先级要高,(==,!=)优先级要低
关系表达式中,关系运算符从左到右结合,返回值为 真1假0
逻辑运算符(与或非)
在内部也有先后级别,!的等级最高,然后是与(&&),最后是非(||)
同样是从左到右,返回值真1假0,非零也是真
a&&b&&c中,只有判断了a是非零,才会继续判断
条件运算符(?)
有条件表达式,格式如下
//表达式1? 表达式2:表达式3
max =(a>b)?a:b //先判断括号里面的,真时求解表达式2,假时求解表达式3函数
printf函数
%f 处理的方法一般是整数部分全部输出,小数部分输出六位数
%m.nf 指定了n个小数位数,对下一位四舍五入。但是float型只能保证六位有效数据是准确的,而double只能保证十五位有效数字是正确的
%-m.nf 加了这个负号让数据向左补齐,右端补上空格
想要输出%,就要写%%
scanf函数
如果格式控制字符串里面,除了格式声明还有别的字符,那就必须一一对应
%c 格式声明时,空格和转义字符都作为有效字符输入,所以就得输入abc,而不是a b c。在连续输入数值的时候需要用空格或者别的分隔符分开。
getchar,putchar函数
get就是输入,put就是输出
控制字符,如换行也算一个字符
选择结构
计算一元二次方程组的时候,因为实数运算有误差,所以要判断它是不是小于一个足够小的数,譬如 disc>1e-6
if语句中,如果没好好使用花括号,else会与其上方的,最近的,没配对的if配对
case子句中,不加花括号也可以,也知道是执行case后面的全部语句
switch中可以有可以没有default标号,如果没有default,也没有匹配的case,那就会执行下一个语句。这些标号的位置也可以调换
循环结构
while和do…while();的区别
两边都必须有表达式。后者是先无条件执行语句,然后判断循环条件。
如果一开始while后面的表达式就是假,那么这两种表达形式的结果不一样;其他时候一样
指针
指针是地址,指针变量的值是地址。
int * p;
p=&a;第一条定义了指向整型数据的指针变量,然后把a的地址赋给指针变量。两侧的类型需要一致。
printf("%d",*p);
*p=1; //把1赋给a
printf("%o",p); //这是一八进制输出指针变量p的值,就是输出a的地址用指针引用数组元素的时候,可以用 &a[i] 代表序号i的地址,也可以用 *(a+i)
指针也会指向数字以后的存储单元,这里的数值是不可预料的,要注意指针的值
比如说令p=a后,p++是可以实现的,而a++不可,因为a固定是第一个元素的地址了
如果对p进行计算,那么计算的是地址;如果对*p进行计算,那么计算的是对应元素的值。
指针变量是不可以直接用的,必须有赋值的过程
结构体里面,是不可以直接通过结构体变量名引用全部成员的,只能逐个引用
更新日志
cc655-newyear于
