目录
学习目标:
补充整型和实型数据知识
理解字符型数据(字符常量,字符串变量,转义字符等)
理解各种运算符(赋值,运算等)
学习内容:
整型数据的范围
#include <stdio.h>
void main()
{
short int a,b;
a = 32767;
b = a+1;
printf("%d,%d\n",a,b);
}
32767 : 0111 1111 1111 1111
-32768: 1000 0000 0000 0000
2^15=32768,可以看出范围为(-2^15)——(2^15-1)
实型数据范围区别
#include<stdio.h>
void main()
{
double a,b;
a = 123456.789e5;
b=a+100;
printf("%f\n",a);
printf("%f\n",b);
}
#include<stdio.h>
void main()
{
float a,b;
a = 123456.789e5;
b=a+100;
printf("%f\n",a);
printf("%f\n",b);
}
可以看出,double与float的范围不同,举例为正,首位还有符号位。
#include <stdio.h>
void main()
{
printf("%f",1.0/3);
}
字符型数据
字符常量
用单引号括起来的一个字符。例如 ‘a’ , ‘b’ , ‘=’ , ‘+’ 都是合法的字符常量
在C语言中,字符常量有以下特点:
1.字符常量只能用单引号括起来,不能用双引号或其他括号
2.字符常量只能是单个字符,不能是字符串
3.字符可以是字符集中任意字符,但数字被定义为字符型之后就不能参与数值运算。
如 ‘5’和 5 是不同的。‘5’ 是字符常量,不能参与运算。
字符变量
字符变量用来存储字符常量,即单个字符。
字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。
例如:Char a ,b ;
转移字符
转义字符是一种特殊的字符常量。转移字符以反斜杠 “\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称为 “转义”字符。例如,在前面各例题printf 函数的格式中用到的 “\n” 就是一个转义字符,表示的是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。
转义字符 | 值 | 输出结果 |
\n | 换行 | 将光标移到下行开头 |
\f | 换页 | 将光标移到下页开头 |
\t | 水平制表符 | 将光标移到下个Tab位置 |
\v | 垂直制表符 | 将光标移到下个垂直制表对齐点 |
\b | 退格 | 将光标后退一个字符 |
\r | 回车 | 将光标移到本行开头 |
\\ | 反斜线\ | 输出\ |
\' | 单引号 | 输出' |
\" | 双引号 | 输出" |
\? | 问号 | 输出? |
\a | 警告 | 产生声音 |
\ddd | 八进制 | 输出与d数相同位数的八进制数(1~3) |
\xhh | 十六进制 | 输出与h数相同位数的十六进制数(1~2) |
每个字符变量被分配一个字节的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。 如x的十进制ASCII码是 120, y的ASCII码是121。对字符变量a,b,赋予’x’和’y’值: a = ‘x’ ; b = 7 ;实际上是在a,b两个单元内存放 120 和55 的二进制代码。
转义字符的使用
#include<stdio.h>
void main()
{
int a,b,c;
a =5;b = 6; c = 7;
printf("ab c\tde\rf\n");
printf("hijk\tL\Bm\n");
}
ASCII码表
字符串常量
是由一对双引号括起的字符序列,例如“CHINA”,”C program”
字符串常量和字符常量是不同的量。他们之间主要有以下区别:
1.字符常量由单引号括起来,字符串常量由双引号括起来。
2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。
例如: 可以char a = ‘a’ 但是不能 char a = “a” ;
4.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数+1. 增加的一个字节中存放字符 “\0”(ASCII 码为0),这是字符串结束的标志。
例如"a"和'a'
a | \0 |
占两个字节
a |
占一个字节
变量赋初值
类型说明符 变量1 = 值1,变量2 = 值 2, ······;例如:
int b ,c = 5;
float x = 3.2,y=3f,z = 0.75;
char chl = ‘K’, ch2 = ‘P’;
不同类型数据混合运算
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。自动转换发生在不同的数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则。
1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2.转换按数据长度增加的方向进行,以保证精度不降低。如int 型和long 型运算时,先把int 量转成long 型后再进行运算。
3.所有的浮点型运算都是以双精度进行的,即使仅含有float单精度运算的表达式,也要先转换成double型,再作运算。
4.Char型和 short型参与运算时,必须先转换成int 型。
t b ,c
在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。
如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分将四舍五入向前舍入。
类型自动转换的规则:
#include<stdio.h>
void main()
{
float PI = 3.14159 ;
int s ,r = 5;
s = r * r * PI;
printf("s = %d \n",s);
}
= 5;
PI 为实型, s,r 为整型。 在执行 s = r * r*PI 语句时,r 和 PI 都转换成double 型计算,结果也为 double 型。 但由于s 为 整型, 故赋值结果仍为整型, 舍去了小数部分。
强制类型转换
强制类型转换是通过类型转换运算来实现的。
其一般形式为:
(类型说明符) (表达式)
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如:
(float)a 把 a 强制转换为实型
(int )(x+y) 把x+y的结果转换为整型
在使用强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int )(x+y)写成 (int)x+y 则表示把x 转换成int 型之后再与 y 相加了。
2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。float x = 3.2,y=3f,z = 0.75;
#include<stdio.h>
void main()
{
float f = 5.75;
printf("(int)f = %d , f = %f \n",(int)f ,f);
}
char chl = ‘K’, ch2 = ‘P’;
float虽然强制转换为int 型,但只在运算过程中起作用, 是临时的。
而f 本身的类型没有改变,因此 ,(int)f 的值为5,而 f 的值仍然为5.75 。
运算符
基本运算符
1.加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算。
如A+b , 4+8等,具有右结合性。
2.减法运算符 ”-” : 减法运算符为双目运算符。但 “-”也可作为负值运算符,此时为单目运算符,
如 -5, -x 等具有左结合性。
3.乘法运算符 “ * ” :双目运算符,具有左结合性,
4.除法运算符“/”:双目运算符具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。 如果运算量中有一个是 实型,则结果为双精度实型。
运算符的优先级: C语言中,运算符的运算优先级共分为15级,1级最高,15级最低。在表达式中,优先级较高的先于优先级教低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。
运算符的结合性: C语言中各运算符的结合性分为两种,即左结合性(自左向右)和右结合性(自右向左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z 则y应先和 “-”号结合,执行 x –y 运算,然后再执行 +z 的运算。这种自左至右的结合方向称为 “左结合性”。而自右向左的结合方向称为“右结合性”。最典型的有结合性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应 先执行 y=z 再执行 x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误
自增‘自减运算符
++i :i 自增1后参与其他运算
--i : i 自减1后在参与其他运算
i++ : i 参与运算后,i 的值再自增1
i -- : i 参与运算后,i 的值再自减 1
#include<stdio.h>
void main()
{
int i =8;
printf("%d \n",++i);
printf("%d \n", --i);
printf("%d \n",i++);
printf("%d \n",i--);
printf("%d \n",-i++);
printf("%d \n",-i--);
}
赋值运算符
简单赋值运算符和表达式: 简单赋值运算符记为 “=”。
由 “=”连接的式子称为赋值表达式。其一般形式为 : 变量= 表达式。
例如:x = a + b , x = sin(a) + sin(b)
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型转换成左边的类型。具体规定如下:
1.实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。
2.整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分值为0)
3.字符型赋予整型,由于字符型为一个字节,而整型为四个字节,故将字符的ASCII码放到整型量的低八位中,高八位为0,整型赋予字符型,只把低八位赋予字符量。
复合赋值符
在赋值符 “=”之前加上其他的双目运算符可构成复合赋值符。
如 +=, -=,*=, /=,>>=, <<=, &= ,^=, ! =
例如: a+ = 5; 等价与 a = a+5;
x* = y+7 ; 等价于 x =x*(y+7)
复合赋值符这种写法,十分有利于编译处理,能提高编译效率并产生质量较高的目标代码
逗号运算符
在C语言中 “ , ”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为: 表达式1 , 表达式2
其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。
对于逗号表达式还要说明两点:
1.逗号表达式一般形式中的表达式1 和表达式 2 也可以又是逗号表达式。
例如: 表达式1 ,(表达式2,表达式3)
形成了嵌套情形。因此可以把逗号表达式扩展为以下形式:
表达式1,表达式2,….表达式N
整个逗号表达式的值等于表达式N的值
2.程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符
#include<stdio.h>
void main()
{
int a = 2,b =4 , c =6,x ,y ;
y = ((x= a+b),(b + c));
printf("y = %d,x = %d",y,x);
}
#include<stdio.h>
void main()
{
int a = 2,b =4 , c =6,x ,y ;
y = (x= a+b),(b + c);
printf("y = %d,x = %d",y,x);
}
题目练习
给出三角形三边,求面积
#include<stdio.h>
#include<math.h>
void main()
{
double a,b,c,s,area;
a=3.67;
b=5.43;
c=6.21;
s=(a+b+c)/2;
area=sqrt(s*(s-b)*(s-a)*(s-c));
printf("a=%f\tb=%f\tc=%f\n",a,b,c);
printf ("area=%f\n",area);
}