第 3章 数据类型、运算符和表达式
主要内容:
1,数据类型
2,常量和变量
3.基本数据类型,整型,实型,字符型
4,最常用的运算符和表达式:
算术运算符和算术表达式、赋值运算符和赋值表达式引 入
假设某任务中有如下数据需要处理,1024,65536、
123.5,123.456789e10,'a',"name"
设计算法前,需要先定义数据结构:即如何在计算机中表示这些数据?
编程时,函数的说明部分就是对数据结构的描述,可执行部分是对算法的具体描述。那么,在 C语言中如何描述数据结构呢? —— 数据类型
数据结构描述完毕,然后是算法的 C语言描述了。算法是对数据处理过程的描述,数据处理过程许多基本操作是如何实现的呢? ——运算符 和表达式
3.1 C的基本语法单位
1、字符集 character set
2、关键字 keyword
3、标识符 identifier
标识符命名规则,
( 1)由字母、数字及下划线组成,且不能以字母开头。
( 2)不能与关键字同名
( 3)尽量“见名知义”
例如:下列标识符,是否合法?为什么?
area if score student_no 2day month_3 int
_sum no*3 &aa
3.2 常量和变量
例 1:输入任一半径,计算球的体积。
#define PI 3.1415926 /*定义符号常量 PI */
main( )
{ float r,v ; /*定义变量 r,v*/
printf("\n enter r:");
scanf("%f",&r);
v = PI*r*r*r*4/3; /*3,4 是常量 */
printf("\n volume,%f ",v);
}
由例题分析可知:
常量,在程序的运行过程中其值不能被改变的量。如程序中的 3,4
符号常量,用一个标识符代表一个有特定含义的常量。如 PI
变量,在程序的运行过程中其值可以被改变的量。如 r,v
提示:变量必须先定义,后使用原因有两个:
(1)系统根据变量的类型为其分配合适的存储单元。如 系统给 r,v 各分配大小为 4B 的单元
(2)编译系统根据变量的类型进行语法检查。如 r %5 是非法的表达式
3.3 基本数据类型:整型、实型、字符型
主要掌握各种类型的常量表示、变量的定义、
所占存储空间的大小、取值范围一,整型:
用于表示整数所占内存空间:随机器而异,一般微机上一个整型数据占 2B 的内存空间。
整型的可用修饰符:
short [int]
long [int]
unsigned int / unsigned short
/unsigned long
整型变量的定义(或说明):
如,int a,c,no;
long s;
unsigned x,y; 等
整型常量:
decimal,12 -3 0
octal,024 056
hexadecimal,0x3A -0X34
long int,12L 0L
问题,要定义两个变量 x 和 y,分别用于存放数据
1024 和 65536,如何确定 x和 y类型?
分析:首先,要处理的数据为整型;
其次,根据数据的大小确定其具体类型,1024
可用 int 型变量保存,65536必须用 long int 型变量才能保存。
程序:
main( )
{ int x; long y ;
x=1024; y= 65536 ;
printf("\n x=%d,y=%ld",x,y);
}
说明,若 x,y 均定义为 long 型,程序运行如何?
若 x,y均定义为 int 型,程序运行结果如何?
二、实型
Float,单精度浮点型
Double,双精度浮点型
所占空间大小,在一般微机上,float 型数据占 4B,
double型数据占 8B。当然 double型数据的表示范围大。
实型变量的定义:
float r,v ;
double z,a,x ;
float result ; 等
实型常量:
( 1)小数形式,可由正负号、小数点和数字 组成。
如,12.35 -78.09 0.789,145
(2) 指数形式,用科学计数法表示的实数。
如,44e –3 0.34e12
问题,若程序重要处理的数据为,123.5 和
123.456789e10,设该数据分别用变量 a,b 保存,试问 a,b的类型如何确定?
分析:首先该数据均为实型; 其次,根据数据的大小及精度,可确定 a 为 float型即可,b必须为 double型。
程序如下:
main( )
{ float a; double b;
a=123.5; b= 123.456789e10 ;
printf("\n a=%f,b=%f",a,b) ;
}
运行结果:
a=123.500000,b=1234567890000.000000
若改为,float b; 运行结果如下:
a=123.500000,b=1234567954432.000000
三、字符型 char
Size,占 1B,只能保存一个字符。其取值范围为,0~255
字符常量:
普通字符,用单引号括起来的一个字符,如 'a' 'f' '*'
'#' '2'
转义字符,用单引号括起来的、以 "\"开头的字符序列,如
'\n' '\t' '\100' '\x10' '\
字符常量的值是该字符的 ASCII码值(即该字符在你的机器中所用的字符集中的编码)
如字符 '0' 的值是整数 48
字符串:
用双引号括起来的字符序列,如 "a" "$#%" "123\n"
""(空串)
注:字符串存储时,系统自动在字符串的末尾加上字符串结束标记 '\0'
比较字符常量 'a'与字符串常量 "a",
'a' "a"
'a' '\0'
字符变量的定义及使用:
char ch1,ch2;
/*定义两个字符变量 ch1,ch2 */
unsigned char ss; /*定义一个无符号字符变量 ss*/
97 97 0
例 3.5 定义两个变量 c,d,用于保存字符 'a','b',然后按字符和数值两种形式输出变量 c,d的值。
main( )
{ char c,d ;
c= 'a' ; d='b' ;
printf("\n %c %c",c,d);
printf("\n %d %d",c,d);
}
Rusult:
a b
97 98
若将第三行改为,c=97; d=98; 结果如何?结论:
在字符的 ASCII码( 0~255)内字符与整数可通用。
3.4 变量的初始化 (自学)
如 int r=6; 等价于
int r ; r=6;
应用:
编程时,当定义变量时就已知该变量的值,则可以使用初始化的方式给变量赋值。
注意:
int i=j=k=0; 是错误的。正确的应为:
int i=0,j=0,k=0;
3.5 运算符和表达式
运算符,规定了对数据的基本操作。
主要掌握:各运算符的功能、优先级和结合方向。
本章只介绍最常用的运算符:
算术运算符、赋值运算符 及其表达式
3.5.1 算术运算符和算术表达式
1,基本算术运算符和表达式,
+ – * / %
如,10%3 4/2 6+8 7/5 78-9
特点:双目运算符,即要求有两个操作数。
% 运算符要求两个操作数必须是整型数。
如 8.4%4 是错误的。
其他的算术运算都是通过调用数学函数实现的,其对应的头文件是,math.h
如 pow(x,y) 表示 xy
2,自增、自减运算符,++ --
功能:使变量自增 1、自减 1
例如:计算 1~10的和。
main( )
{ int n=0,j;
for( j=1; j<=10; j++)
n=n+j;
printf("\n sum,%d",n);
}
说明,j++ 等价于 j = j+1
同理,k -- 等价于 k= k-1
自加、自减运算符的 前缀和后缀 用法的区别:
例如:
main()
{ int i=6,j=6,k=6,h=6,m,n,x,y;
m=i++; n=++j; x = k--; y= --h;
printf("\n i=%d,m=%d,j=%d,n=%d",i,m,j,n);
printf("\n k=%d,x=%d,h=%d,y=%d",k,x,h,y);
}
运行结果:
i=7,m=6,j=7,n=7
k=5,x=6,h=5,y= 5
结论,
前缀,n=++j; 等价于 j=j+1; n=j;
( j先加 1,后参与表达式的运算)
后缀,m=i++; 等价于 m=i; i=i+1;
( i 先参与表达式的运算,然后加 1 )
3,算术表达式的计算,当一个表达式中包含多个算术运算符时,如何计算呢?
表达式的计算方法,按优先级由高到低进行,相同优先级的运算符按结合方向计算。
例如计算,4 + 5*8/10 – 12%5/2
优先级,先 ++ -- 负号,后 * / %,
然后 + -
结合性,++ -- -(负号 ) 自右向左;其他的,
自左向右算术表达式的书写
要求自学
注意:表达式中的符号均写在同一行中,不能有上标或下标。
合理运用括号,保证原数学表达式的运算顺序。
3.5.2 类型转换
1,当参加运算的两个操作数类型不同时,先将“低”
类型的数据转换为“高”类型,再计算。 ——隐式转换(系统自动进行的转换)
类型高低:参见 p38
例如:计算表达式 2.5*4+12 - 1.5
2.,当需要将某数据转换成指定类型时使用 ——强制类型转换 。
例如,函数 sqrt的原型,double sqrt(double)
如果要计算整数 n 的平方根,应写为:
root = sqrt( (double) n );
例 3.8 含有牵制类型转换的表达式的计算。
main()
{ int a=2,b=3;
float x=3.5,y=2.5,z;
z=(float )(a+b)/2 + (int)x%(int)y;
printf("\n %f",z);
}
运行结果:
3.500000
3.5.3 赋值运算符和表达式
赋值,给变量提供数据的一种方法。
1,赋值表达式,变量 = 表达式
作用:先计算,=”右边表达式的值,然后将其送给
,=”左边的变量。
如 area = r*r*3.14
s=0
n=n+2
优先级,比算术运算符低,仅高于逗号运算符。
结合性,自右向左若定义,int a=2; 则表达式 b=c=a+4 的计算过成为:
先计算,c=a+4 得该表达式的值为 6 ;然后计算:
b=6 得该赋值表达式的值为 6。
2,复合赋值表达式:
变量 op = 表达式等价于,变量 = 变量 op(表达式)
例如,k +=2 等价于 k=k+2
x*= 3+6 等价于 x = x*(3+6)
3,赋值运算中的类型转换,
当赋值号,=” 右边表达式的值与,=”左边的变量的类型不同时,先将,=”右边表达式的值转换成
,=”左边变量的值,然后再赋值。
such as,int n=4; float s;
s = n*5;
result,float
3.5.4 逗号运算符
如,for( j=0,s=0,p=1; j<10; j++)
{s + =j; p*=j; }
逗号表达式的计算:自左向右依次计算各表达式
逗号表达式的值:最右边一个表达式的值
(要求自学)
作 业上机练习,1
习题 1,3,5,6,7
预习:第四章 顺序结构程序结构要求明确:
Getchar() putchar() scanf() printf() 的使用