1. 变量与表达式
1.1 实型变量
单精度 (float型)
float x,y;
双精度(double型)
double a,b,c;
数据精度 | 存储 | |
---|---|---|
单精度 | 7位有效数字 | 4个字节存储 |
双精度 | 15-16位有效数字 | 8个字节存储 |
超过有效数字的位数后,下一位就会失去精度成为约数
一个实型常量部分float和double型,
使用printf()输出
输入scanf()
- %f:以小数形式输出浮点数,保留六位小数,超出位数四舍五入
- %lf: 以小数或指数形式输入一个双精度浮点数
- %.nf:规定小数保留n位,也可以写成%.nlf
- %e: 以指数形式输出 (不常用)
- %le:
float和double使用不同格式控制说明
%f代表单精度浮点型数据(float),%lf代表双精度浮点型数据(double)
注意:再输入时不可以使用%.nlf会出现0.0000情况,输入时%lf已经可以接收超过6位的小数,只是输出时没有显示
1.2 字符常量
1.字符常量 :用单引号括起来一个字符 (一个字节)
ASCII码表:
- ‘a’ : 97
- ‘A’: 65
- 需要记住 :0-9 A-Z a-z
小写字母=大写字母+32
2.转义字符:不能用符号直接表示的字符常量 通常(\)后面的字符
常用的转义:
- \n : 换行
- \b : 退格
- \r : 回车
- \a : 报警
- \v : 竖向眺格(垂直制表)
- \t : 横向眺格(水平制表)
- \f : 走纸换页
- \0 : 空字符
数字转义:
\101:代表ASCII为65的’A’
双引号“1”占两个字节 内存中是 1 \0其中\0表示字符串结束
1.3 字符变量
定义形式:char 标识符1,标识符2
字符的存储:
- 字符型数据和整型数据之间可以通用
- 字符在内存中占一个字节,在内存中,是把字符对应的SSCII码值放到存储单元中
printf输出:
- %c : 表示一个字符
- %d : 输出一个数,字符也会转成数字
getchar与putchar
char ch;
ch=getchar();//从控制台获取一个字符
putchar(ch); //控制台输出字符
注意:这两个方法都是对于char类型的方法
scanf越简单越好scanf(%d%c%d),输入时就不能有空格,如:10c20,并且较为复杂计算机容易出错,故不推荐这种复杂的输入形式
注意:不能加空格是因为中间是字符数据,空格也算是一个变量,%d%d这用形式要以空格和回车分割
1.4 字符串常量
定义形式:String a,b;
字符串占用公式:字符串结尾以\0结尾故存储字节为 字符串长度+1个字节
例如:c=“china” 在内存中是 c | h | i | n | a | \0 这样划分的,共占用6个字节
1.6 各类数值型数据数据的混合运算
数值转换:
- 隐式转换:系统自动
- 强制转换:人为强制
自动转换规则:低字节长度转化为高字节长度
强制类型转换:
形式:(类型名)(表达式)
例如;: double a,b; (int)(a+b)
注意:强制类型转换可能会造成数据精度的丢失
难点:x=3 想得到 3/2 的结果是(float)x/2 还是(float)(x/2)
答:(float)x /2
1.7 c语言运算符
关注一下符号优先级
+ - * / % 都是双目运算符
++与–都是单目运算符
单目与双目:一个值运算与两个值运算
自增自减运算符(++,–)
只适用于变量运算
++n和n++的区别:
- n++: 与n=n+1
- ++n: 去n的值作为表达式n的值,然后再进行n=n+1的操作
难题:设a=2,执行语句k=++a+a++后k的值为多少
- 思路:++a的结果是a变成了3,加上a++则为3加上a当前的值(3)k的结果值为6
- 注意:++a以后a的值就已经增加了
赋值运算符
- 赋值运算符(=)
形式:变量名=常量或表达式
作用:将右边常量或表达式的值赋给左边的变量 - 赋值表达式
难点 :连续值计算
例子:若a=12计算,a+=a-=a*a
步骤:- a-=a*a=>a=a-a*a=12-12*12=-132
- a+=-132=>a=a+(-132)=-264
注意:连续赋值运算,计算顺序是自右至左的
逗号运算符
优先级:是所有运算符中级别最低的
表达式:
- 形式: 表达式1,表达式2
- 例子:a=3*5,a*4 结果为先算3乘5的值在乘上4为60
2. 简单的程序设计
2.1 语句分类
c语句划分:
- 控制语句
- 函数调用语句
- 表达式语句
- 空语句
- 复合语句
重点:一个完整的语句必须以;结束,“;”是一个语句不可缺少的一部分
2.1.1 控制语句
- if()else (条件语句)
- for()~ ( 循环语句)
- while()~(循环语句)
- continue (结束本次循环语句)
- break (终止执行switch或者循环语句)
- goto (转向语句) 想去哪就去哪,不在经常使用
- return (从函数返回语句)
2.1.2 函数调用语句
由一次函数调用加一个“ ;"构成
如:printf(”sdfsfd");
注意函数调用是从:#include <stdio.h>中调用的
2.1.3 表达式语句
由表达式加上‘’;“构成
例子:
- x+4*y; 算数表达式语句
- 4* 7,4+8;逗号表达式语句
- x=4+8 ; 赋值表达式语句(赋值语句)
2.1.4 空语句
只由一个”;“构成
作用:
- 程序转折点
- 什么也不做的循环体(等待开发)
2.1.5 复合语句
用{ }括起来的语句,没有”;“
2.1.6 知识小结
- 赋值语句和赋值表达式并不相同,有;结尾的赋值表达式是赋值语句
2.2 输入输出语句
常用输出输入语句:
- putchar 输出字符
- getchar 输入字符
- printf—根据格式输出
- scanf—根据格式输入
- puts --输出字符串
- gets --输入字符串
scanf输入格式
- 转换字符(就是%后跟的部分)
- a 读 浮点值(仅适用于 C99)
- A 读浮点值(仅适用于 C99)
- c 读单字符
- d 读十进制整数
- i 读十进制、 八进制、十六进制整数
- e 读 浮点数
- E 读浮点数
- f 读浮点数
- F 读浮点数(仅适用于 C99)
- g 读浮点数
- G 读浮点数
- o 读八进制数
- s 读 字符串
- x 读十六进制数
- X 读十六进制数
- p 读 指针值
- n 至此已读入值的等价字符数
- u 读无符号十进制整数
- [ ] 扫描字符集合
- % 读 % 符号( 百分号)
print输出语句
%c输出完以后会有一个空格
\t制表符占包括前面的8个空格
例如:
123456\t 这样就会占用6后面的2个字符,然后继续输出
- %md表示显示数字宽度,宽度小于m后自动左端空格补全
- %ld表示输出长整形数据
- %o 以八进制格式输出整数
- %x以16进制输出格式
- %u以十进制形式输出unsingned型数据
%o%x%u 负数会以反码形式显示出来
难点:源码,反码,补码
在学习原码,反码和补码之前, 需要先了解机器数和真值的概念。
-
机器数
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。
那么,这里的 0000 0011 和 1000 0011 就是机器数。 -
机器数的真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(1000 0011转换成十进制等于131)。
所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 -
原码, 反码, 补码的基础概念和计算方法
-
原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
比如:如果是8位二进制:[+1]原= 0000 0001,[-1]原= 1000 0001第一位是符号位,因为第一位是符号位,所以8位二进制数的取值范围就是:(即第一位不表示值,只表示正负。)[1111 1111 , 0111 1111]即[-127 , 127]
原码是人脑最容易理解和计算的表示方式。 -
反码
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
例如:
[+1] = [0000 0001]原= [0000 0001]反
[-1] = [1000 0001]原= [1111 1110]反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。 -
补码
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。 (也即在反码的基础上+1)
[+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补
[-1] = [1000 0001]原= [1111 1110]反= [1111 1111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。 -
进制原码反码补码
各进制的原码反码形式是不一样的,下面举例-1的反码,注意:原码
2进制 11111110
8进制 17777777
16进制 ffff 因为f是15,所以四个f占了8个数,首数字是1
-
3. 例题
例题1:
scanf(“a=%db=%d”,&a,&b)如果想要a=3,b=7控制台怎么输入
答: a=3b=7回车
例题2:
float a,b;
char c1,c2;
scanf("%f%e",&a,&b);
scanf("%c%c",&c1,&c2);
printf(“a=%f与b=%f\n%c与%c”,a,b,c1,c2);
想要输出
a=3.5与b=71.82
a与c
该怎么输入
答:3.5 71.82ac
注意:这里应用空格划或者分两个数字,但不能用空格划分数字与字符,因为空格也算一个字符