第 2章 基本数据类型,运算符和表达式第二章 基本数据类型、运算符和表达式
2.1 标识符
2.2 C语言的基本数据类型
2.3 各类数值型数据间的混合运算
2.4 C语言的运算符和表达式
2.5 小结第 2章 基本数据类型,运算符和表达式
2.1 标识符
2.1.1 标识符在 C程序中,能够标识函数、语句标号、变量的一串字符叫标识符,C程序中使用标识符的具体规定如下:
标识符必须由英文字母,数字或下划线组成,且首字符只能是英文字母或下划线正确的标识符,如:
b123 pust _456 vfp_123
第 2章 基本数据类型,运算符和表达式
C程序中区别大,小写字母。如,A,a,DOG,dog等都是代表不同的标识符,如果在程序中用以表示变量,
那幺它们分别代表不同的变量。
禁止使用关键字作为标识符。
2.1.2 关键字关键字又叫保留字,是 C编译系统预先定义的些具有特定含义的标识符。标准 C的关键字有存储类型符,
数据类型符和语句定义符三类。
第 2章 基本数据类型,运算符和表达式
C语言预处理中经常用到一些专用命令,如:
1.宏定义预处理命令,#define
2.文件包含预处理命令,#include
3.条件编译预处理命令,#undef,#ifdef,#endif,
#if,#else,#ifndef
这些都是 C语言特有的编译预处理命令,其主要特征是它们均以,#‖开头,不同于前面的关键字。
第 2章 基本数据类型,运算符和表达式表 2.1
auto default float register struct while
break do for return switch volatile
case double goto short typedef
char else if signed union
const enum int sizeof unsigned
第 2章 基本数据类型,运算符和表达式
2.2 C语言的基本数据类型
2.2.1 常量与变量一.常量在程序运行过程中,其值不能被改变的量称为常量。
常量的类型众多具体可分为以下几类:
常量数据类型,短整型常量取值范围在 -32768 ~
+32767之间的整数。
长整型常量取值范围在 2147483648~ +2147483647的整数,实型常量取值范围在 10-38~ 10+38,有效数字是 7位
1038?
第 2章 基本数据类型,运算符和表达式字符常量:用单引号引起来的单个字符。
字符串常量:用双引号引起来的一串字符。
符号常量:须经宏定义才能使用。
转义字符常量:用与输入输出函数的专用常量。
如,52,0,-78为整型常量,2.3,0.58为实型常量,‘ l‘,
‘ n?为字符型常量,,hello‖,,abcdef‖为字符串常量。
二.符号常量符号常量是在程序(或程序的一部分)中指定用一个符号(标识符)代表一个常量。
1038?
第 2章 基本数据类型,运算符和表达式
【 例 2.1】
# define PI 3.14 /*定义符号常量 */
main()
{
float r,a;
r=2.0;
a=PI*r*r;
printf(" a=%f",a) ;}
第 2章 基本数据类型,运算符和表达式程序中用 #define命令行定义 PI代表常量 3.14。程序的运算结果是 a=12.560000。由此我们可以总结出,用符号代替一个常量,使程序更易理解,可读性好。当需要修改时只需要修改一处即可,方便不易出错。
定义符号常量的一般格式是:
#define 符号常量 常量这是一种预编译命令,它不同于变量,符号常量的值在其作用域内不能改变,也不能再被赋值。
第 2章 基本数据类型,运算符和表达式如再用以下赋值语句给 PI赋值:
PI=3.1415;
是错误的;
习惯上,符号常量名用大写,变量名用小写,以示区别。
第 2章 基本数据类型,运算符和表达式三.变量整数类型,整型,短整型,长整型,无符号整型,无符号短整型,
无符号长整型。
实数类型(浮点类型),单精度浮点型,双精度浮点型,
长双精度浮点型。
字符类型,枚举类型。
构造类型:数组类型,结构体类型,共享体类型。
指针类型,空类型。
第 2章 基本数据类型,运算符和表达式
1.变量及变量名在程序运行过程中,其值可以改变的量称为变量。一个变量应该有一个名字,称为变量名。
用来标识变量名,符号常量名,函数名,数组名,类型名,文件名的有效字符序列称为标识符,
C语言规定标识符只能由字母,数字,下划线三种字符组成,
且第一个字符必须为字母或下划线 。
第 2章 基本数据类型,运算符和表达式
2,变量说明与变量赋值
( 1)变量说明在 C语言中,程序中引用一个变量,实际上是对指定存储空间的引用。因此,必须先开辟(分配)存储空间才能引用它。那么,在引用变量之前就必须先对变量进行说明,所谓变量说明即定义变量的类型。这就是“先定义,后使用”。其格式如下:
类型标识符 变量表列第 2章 基本数据类型,运算符和表达式
( 2)变量赋值从运算器向变量所代表的存储单元传送数据的操作称为赋值。简单的说,就是将一个数据赋给一个变量。
变量 =表达式说明:
,=‖是赋值符号,不是等号。
赋值运算的作用是将,=‖右侧表达式的值赋给,=‖左侧的变量。步骤是先计算表达式的值再向变量赋值。
第 2章 基本数据类型,运算符和表达式
3,变量初始化
C语言允许在定义变量时对变量赋初值,即变量的初始化。
2.2.2 整型数据整型常量即整常数。 C语言整常数的书写形式可用以下三种形式表示:
– 十进制整数
– 八进制整数。以 0开头的数是八进制数
– 十六进制整数。以 0x开头的数是十六进制数第 2章 基本数据类型,运算符和表达式整型变量
1.整型变量的分类基本型 int
短整型 short int或 short
长整型 long int或 long
它们又区分为有符号( signed),无符号( unsigned)两大类。
对于有符号数,存储单元的最高位用来存储符号,0对于无符号数,存储单元中全部用二进制位( bit)存放数的本身,而不包括符号。
第 2章 基本数据类型,运算符和表达式无符号变量只能存放不带符号的整数类型标识符所占位数数的范围:
[signed]int 16 -32768~ 32767
[signed]short[int] 16 -32768~ 32768
[signed]long[int] 32 -2147483648~ 2147483647
unsigned [int] 16 0~ 65535
unsigned short [int] 16 0~ 65535
unsigned long [int] 32 0~ 4294967295
第 2章 基本数据类型,运算符和表达式
2.整型变量的定义
C规定在程序中所有用到的变量都必须在程序中说明其类型,
即“定义”。例如:
int a,b;(指定变量 a,b为整型)
long e,f;(指定变量 e,f为长整型)
unsigned short c,d;(指定变量 c,d为无符号短整型)
对变量的定义,一般是放在一个函数体的开头部分(也可以放在程序中间,但作用域只限于该程序块)。
第 2章 基本数据类型,运算符和表达式
3.整型常量的类型一个整型常量,如果其值在 -32768~ +32767范围内,认为它是 int型,它可以赋值给 int型和 long int型变量。
一个整型常量,如果其值超过上述范围,而在 -
2147483648~ 2147483647范围内,则认为它是 long int型,
可以将它赋值给一个 long int型变量。
常量中无 unsigned型。但一个非负值的整型常量可以赋值给
unsigned型变量,只要它的范围不超过变量的表示数值范围即可。
第 2章 基本数据类型,运算符和表达式在一个整常量后加一个字母 l或 L,则认为是 long int型常量。
如果函数的形参为 long int型,则要求实参也为 long int型,
此时用 123作实参是不行的,而要用 123L做实参。
整型常量向整型变量赋值
1,将带符号的整型数据( int型)赋给 long int型变量时,要进行符号扩展。
方法是:如果 int型数据为正值,则 long int型变量的高十六位补 0;如果 int型数据为负值,则 long int型变量的高位补 1;
第 2章 基本数据类型,运算符和表达式
2,将一个 long int型数据赋给一个 int型变量,要进行数值位截取。方法是:将 long int型数据中低十六位原封不动的搬到 int型变量中。
将一个 unsigned型数据赋给一个占字节数相同的整型变量(如 unsigned int至 int,unsigned long至 short)就是将
unsigned型数据原样送到 unsigned型变量中将非 unsigned型数据赋给长度相同的 unsigned型变量,
就是将非 unsigned型数据原样赋给 unsigned型变量。
第 2章 基本数据类型,运算符和表达式
2.2.3 实型数据一,实型常量实型数据就是带小数点的。实数有两种表示形式:
1.十进制数形式。如,0.678,678.0,678,0.0等
2.指数形式。如,54e3或 54E3都代表 54*103。但注意字母 e或 E之前必须有数字,且 e后面指数必须为整数,如
e6,4e3.2都是不合法的指数形式。
第 2章 基本数据类型,运算符和表达式二,实型变量
C实型变量分为单精度( float型),双精度
( double型)和长双精度( long double型)三类,
float型数据占据 4个字节( 32位),有效数字是 7
位。 double型数据占 8个字节( 64位),有效数字 16
位。 long double型数据占 16个字节( 128位),有效数字 19位。单精度实数的数值范围约为 10-37--1038,
双精度实数范围为 10-307--10308,长双精度实数范围为 10-4931--104932。
第 2章 基本数据类型,运算符和表达式应当说明,实型常量不分 float型和 double型。一个实型常量可以赋给一个 float型或 double型变量。
2.2.4 字符型数据和字符串常量一,字符常量字符常量的特征是只有一个字符,该字符用两个单引号括住,
如‘ a‘,‘ l‘,‘ A‘,‘ *’是字符常量。
二、字符变量字符变量是用来存放字符常量的,它只能存放一个字符,不能存放一个字符串第 2章 基本数据类型,运算符和表达式字符变量也和其它类型变量一样使用前必须先定义,如:
char c1,c2;
表示 c1和 c2为字符型变量,各可存放一个字符。我们可以用下列语句对其进行赋值:
c1=?s‘;c2=?d‘;
三,字符串常量字符串常量是由一对双引号括起来的字符序列或转义字符序列构成。
第 2章 基本数据类型,运算符和表达式如:,how do you do‖,“¥ 123.45‖,,\n\n‖都是字符串常量。
假设 c被指定为字符型变量,
char c;
c=?a‘;
是正确的,而
c=―a‖;
是错误的。当然,也不能将,how do you do‖赋给 c(即
c=―hello‖;),也是错误的。因为一个字符串不能赋给一个字符型变量。
第 2章 基本数据类型,运算符和表达式一.数据类型转换一般地说,一个运算符的两个操作数的类型必须一致才能进行运算操作,但 C语言允许在一个表达式中存在有不同的数据类型的操作数。在对这样的表达式求值时,编译器会对其中的一些操作数自动地进行类型转换,以使一个运算符的两边操作数的类型一致。例如,
10+15.2-27*?a‘-?b‘
2.3 类数值型数据间的混合运算第 2章 基本数据类型,运算符和表达式由系统自动进行数据类型的转换。规则如下所示:
1,所有的 char型和 short型都被转换为 int型 (unsigned型除外 ),
所有的 float型都被转换成 double型。即使两个操作数都是相同类型,只要是 char型或 short型或 float型也要按上述方式转换。
2.对于所有的操作数对,若其中的一个为 double型,则另一个也被转换为 double型;若其中的一个操作数为 long型,
则另一个也被转换成 long型;若其中一个操作数为
unsigned型,则另一个也被转换成 unsigned型。
第 2章 基本数据类型,运算符和表达式对于此种转换详见下表:
高 long double
double float
unsigned long int
long int
unsigned int
低 int char,short
第 2章 基本数据类型,运算符和表达式第二种是强制类型转换。当自动类型转换不能实现目的时,
可以用强制数据类型转换方式。强制类型转换运算符是用圆括号及圆括号中的数据类型说明符表示的。
强制类型转换表达式一般形式:
(数据类型)(表达式)
如:( double) a /*将 a转换成 double类型 */
( int)( x+y) /*将 x+y的值转换成整型 */
( float)( 5%3) /*将 5%3的值转换成 float型 */
第 2章 基本数据类型,运算符和表达式
含有运算符的表达式应该用圆括号括起来。如果 x=3.5,
y=4.1,若将( int)( x+y)写成( int) x+y,两者的运算结果是不一样的,前者的运算结果为 7,后者的运算结果为 7.1。因为前者是将 x+y的结果强制转换成 int型,如果写成后者,则是先将 x的值转换成整型然后再与 y相加,
在强制类型转换时,得到一个所需类型中间变量,原来变量的类型未发生变化,例如 (int)x,如果 x原为 float型,
进行强制类型运算后得到一个 int类型的中间变量,它的值等于 x的整数部分,而 x的类型不变 (仍为 float型 ).
第 2章 基本数据类型,运算符和表达式
2.4 C语言的运算符和表达式程序运算是对数据的加工过程,表示不同运算的符号叫做运算符。我们在这里给大家介绍算术运算符,赋值运算符,逗号运算符等,其它的运算符将在后继章节中逐步介绍。但在这里有必要让大家学习一些运算符的基本知识:
运算符可以分为单目运算符,双目运算符和三目运算符。
第 2章 基本数据类型,运算符和表达式例如,
++ 单目运算符,*,/,双目运算符,?,三目运算符。
优先级别。一个表达式可以有多个运算符,这时首先按运算符的优先级别进行运算,C语言的优先级别与数学运算中的意义相同,它决定了一个表达式的运算顺序。
如果一个操作数两侧有两个不同优先级别的运算符,则先执行“优先级别”高的运算。
第 2章 基本数据类型,运算符和表达式左结合性。如果一个运算符对其操作数自左至右执行规定的运算,则称该运算符是左结合的。运算符 +,-,*,
/,%,&&,|| 等都是左结合性的运算符。例如,5*8/3
8的两侧的运算符分别为 *,/,根据“自左至右”方向的结合原则先 *后 /,即 8先和其左边的运算符结合 (5*8),再与其右边的运算符结合 (40/3)。
右结合性,如果一个运算符对其操作数自右向左执行规定的运算,则称该运算符是右结合的。运算符 =,!,++,-
-等都是右结合性的运算符。例如,a=b=c=8
第 2章 基本数据类型,运算符和表达式
b的两侧有相同的运算符,根据“自右向左”方向的结合原则,它先与其右的赋值运算符结合,即 a=(b=c=8)。
b右边的赋值运算符的右边要求一个运算量,是把 c的值直接赋给 b呢?还是先进行 (c=8)运算呢?由于 c两侧的运算符级别相同而又规定了“右结合性”。因此 c应先以其右的赋值运算符结合,故表达式相当于 a=(b=(c=8))。
第 2章 基本数据类型,运算符和表达式
2.4.1 算术运算符和算术表达式一,算术运算符
1.C语言中的基本算术运算符包括单目运算符,-(负号 ) +(正号 ) 和双目运算符,
+(加 ) -(减 ) *(乘 ) /(除 ) %(模除 )
单目运算符,-‖又叫做一元减运算符,其作用与数学中的负号的作用相同,而 *,/则分别对应数学中的乘,除,例如,
3+5,6-4,3*5,a/b等。
第 2章 基本数据类型,运算符和表达式双目运算符,%‖叫做模运算符或称为求余运算符,其作用是取被除数的模,即被除数除以除数后的余数。例如,
13%5的结果为 3;而 -13%5的结果为 -3。
运算符 %要求它的两个操作数都是整型数据,其它运算符以是任何基本数据类型,若运算符 /的两个操作数都为整数时,则运算结果即商也为整数,小数部分被自然省略。
例如,13/5的结果是 2,5/13结果是 0
若参加运算的两个数只要有一个为实形,则结果是实型。
第 2章 基本数据类型,运算符和表达式
2.算术表达式用算术运算符和括号将运算对象 (也称操作数 )连接起来的,符合 C语言语法规则的式子称为 C算术表达式。运算对象包括常量,变量,函数等。例如,下面是一个合法的 C算术表达式,a*b/c-15+?a?
C语言规定了运算符的优先级和结合性。在写 C表达式时一定要注意运算符的优先次序和结合方向,C表达式求值时,先按优先级别高低次序执行第 2章 基本数据类型,运算符和表达式如果一个运算对象两侧的运算符的优先级别相同,
则按规定的“结合方向”处理。如,a-b+c*d
该表达式的运算顺序为:①由于 b两侧的运算符的优先级别相同,则按“自左至右”结合方向进行因此 b先与减号结合,执行 a-b运算; ②由于 c两侧的运算符的优先级别不同,*的优先级高于 +,因此 c先与 *结合,执行 c*d
运算;③最后执行 (a-b)+(c*d)运算。
第 2章 基本数据类型,运算符和表达式
3.自加自减算术表达式
C语言提供了两个使变量的值加 1和减 1的运算符
++(增量) --(减量)它们都是单目运算符,其运算结果是将操作数的值加 1,减 1。
但是,与其它单目运算符不同的是这两个单目运算符的操作数既可以放在运算符的前面,又可以放在运算符的后面。如:
++i 前置增量 --i 前置减量
i++ 后置增量 i-- 后置减量第 2章 基本数据类型,运算符和表达式例如:设变量 i的值为 5,则 ++i后 i的值将变为 6,即表达式 ++i相当于赋值表达式 i=i+1。又如 --i相当于赋值表达 i=i-1 。
表达式使用中应注意的问题,
++和 --的结合方向是“自右向左”,即右结合性。例如,如果 i的值为 3,对于语句 printf(" %d",-i++);则先取出 i的值使用,输出 -i的值 -3,然后使 i增值为 4。
第 2章 基本数据类型,运算符和表达式
2.4.2 赋值运算符和赋值表达式符号,=‖是赋值运算符,值运算符的运算级别仅高于逗号运算符(,),低于其它所有的运算符,它的结合方向是自右向左。由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。例如 a=5就是一个赋值表达式,它的作用是执行依次赋值操作。把常量
5赋给变量 a。也可以将一个表达式的值赋给一个变量。
赋值表达式的一般格式:变量 =表达式第 2章 基本数据类型,运算符和表达式既是将,=‖右侧的“表达式”的运算结果赋给,=‖
左侧的变量。如赋值表达式 a=6/3是把 6/3的值 2赋给变量 a,同时整个赋值表达式 a=6/3的值也等于 2。
赋值运算符的作用是将一个常量,变量,可参与运算的函数或表达式赋给一变量。
如果赋值运算符两边的数据类型不一致,则运算结果以,=‖左边的数据类型为准。赋值表达式后面加上分号“;”便构成了赋值语句。
第 2章 基本数据类型,运算符和表达式复合的赋值运算符在赋值符,=‖之前加上一个二目运算符,就构成了一个复合运算符。 C语言有 +=,-=,*=,/=,%=,<<=,
>>=,&=,^=,|=等 10中复合赋值运算符。含有复合赋值运算符的表达式叫做复合赋值表达式。如:
a+=3 等价于 a=a+3
x-=y+3 等价于 x=x-y-8
x*=3 等价于 x=x*3
第 2章 基本数据类型,运算符和表达式上述含有复合运算符的赋值表达式中的“表达式”,可以又是一个表达式。下面赋值表达式中又有赋值表达式的叫嵌套赋值表达式。
a=(b=(c=5)) a,b,c的值均为 5
a=5+(c=6) a为 11,c为 6
a=(b=4)+(c=6) a为 10,b为 4,c为 6
a=(b=a+a)*(a=1) 运算过程为先求 b=a+a,然后将 a赋值为
1,进行乘法运算后,a的值再取整个右表达式的值。
第 2章 基本数据类型,运算符和表达式
2.4.3 逗号运算符和逗号表达式逗号“,”,它是一种特殊的运算符 ——逗号运算符。
用逗号运算符连接起来的式子称为逗号表达式。
逗号表达式的一般形式如下:
表达式 1,表达式 2,…,表达式 n
逗号表达式的求解是先求解表达式 1,再求解表达式 2
至 n,整个逗号表达式的值是表达式 n的值。如,45-23,
3+5,6+8的值为 14。
第 2章 基本数据类型,运算符和表达式
逗号运算符是所有运算符中级别最低的。
逗号表达式最常用于循环语句中( for语句)。
请注意逗号作为间隔符和作为逗号运算符的区别。
如:
printf(" %d,%d,%d",( a,b,c),b,c) ;语句中,( a,b,c)中的逗号是运算符,其它的逗号是间隔符。带有圆括号的表达式内的逗号一般作为逗号运算符使用。
第 2章 基本数据类型,运算符和表达式
2.4.4 条件运算符,位运算符及表达式条件运算符若 if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句,并给同一个变量赋值时,可以用简单的条件运算符来处理。例如,
if(a>b) max=a;
else max=b;
可以用下列条件运算符来处理,max=(a>b)?a:b;
第 2章 基本数据类型,运算符和表达式其中,(a>b)?a:b;‖是一个条件表达式。它是这样执行的,如果 (a>b)条件为真,则条件表达式取值 a,否则取值 b。
条件运算符要求有三个操作对象,称为三目运算符。条件表达式的一般形式为:表达式 1?表达式 2:
表达式 3
1.条件运算符的执行顺序:先求解表达式 1,若为非 0(真)则求解表达式 2
第 2章 基本数据类型,运算符和表达式此时表达式 2的值就作为整个条件表达式的值。
若表达式 1的值为 0(假),则求解表达式 3,此时表达式
3的值就是整个条件表达式的值。对于下列表达式:
max=(a>b)?a:b
执行结果就是将条件表达式的值赋给 max。也就是将 a
和 b二者中的大者赋给 max。
2.条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给 max。
第 2章 基本数据类型,运算符和表达式
3.条件表达式不能取代一般的 if语句,只有在 if语句中内嵌的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替 if语句。
4.条件表达式中,表达式 1的类型可以与表达式 2和表达式
3的类型不同。
第 2章 基本数据类型,运算符和表达式二.位运算位运算是一种二进制操作的运算。位运算对象只能是整型数据,包括一般整型,短整型,长整型,无符号一般整型,无符号短整型,无符号长整型和字符型。运算结果仍是整型数据。位运算是对整个数据进行运算,不能只操作其中的某一位,
第 2章 基本数据类型,运算符和表达式
2.5 小结本章介绍了 C语言的数据类型,常量,变量,运算符,
表达式的基本概念及使用方法。总的来说本章的要点归纳如下:数据类型,常量,变量,运算符,表达式。 C语言的“碎”,“繁”,“难”的特点已经初步体现。
变量的作用域是本章的难点,读者一时掌握不了,
可以随着学习内容的不断推进,逐步加深理解和掌握,
不必急于求成。