c语言的数据类型、运算符和表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据类型、运算符和表达式
一、C 语言的基本数据类型
数据是程序处理的对象。
C 中将数据分为不同的数据类型,任何数据都属于某一种特定的数据类型。
数据类型的作用有两个:一是指明为数据分配多大的存储空间和规定了数据的存储结构,进而规定了数据的取值范围;二是规定了数据所能进行的操作。
C 的数据类型分为基本数据类型和构造类型。
基本数据类型是系统定义的,用户可以直接使用。
构造类型由用户自行定义。
C 的数据类型如图所示。
C 标准没有规定各类数据所占用内存位数。
所以不同c 编译系统的各类数据所占用内存位数是不一样的。
上机使用时,应注意使用的c 编译系统的具体规定。
Turbo C 基本类型 所占位数 数的范围 [signed] char 8 -128~127 unsigned char 8 0~255 [signed]int 16 -32768~32767 short [int] 16 -32768~32767
long [int] 32 -2147483648~2147483647 unsigned [int] 16 0~65535 unsigned short [int] 16 0~65535 unsigned long [int]
32
0~4294967295
C++数据类型
基本类型
字符型(char) 空类型(void)
整型
短整型(short int) 无符号整型(unsigned int)
长整型(long int)
基本整型(int) 实型(浮点型) 双精度型(double)
单精度型(float) 指针
构造类型
枚举(enum) 联合(union)
结构体(struct)
数组
float 32 约6位有效数字
double 64 约12位有效数字在Visual C++中:
char:1 Byte
int:4 Byte
short:2 Byte
long:4 Byte
float:4 Byte
double:8 Byte
二、常量
常量:整型常量、实型常量、字符常量、字符串常量、符号常量
1.整型常量
C语言程序中可以使用十进制、八进制和十六进制来表示整型常量。
十进制整型常量,由正、负号和0~9十个数字组成,没有小数部分。
八进制:以数字0开头,后面跟0~7的数字序列,前面可以有正负号。
十六进制:以“0x”或“0X”开头,后跟0~9、a~f(大小写均可)的数字序列。
类型确定:
常量值后跟L或l表示长整数。
后跟U或u表示无符号整数。
后跟LU或lu表示无符号长整数。
2.实型常量
实型常量就是我们日常使用的带小数的常数,也叫浮点数。
在C语言中,只有十进制表示。
它有两种表示形式:小数表示法和指数表示法。
(1)小数表示法:它由整数和小数两部分组成。
这两部分可以省略其中的一个部分,但不能同时都省略(小数点不能省略)。
如:12.35、35.、.689都是double(双精度浮点)型常量。
(2)指数表示法(科学表示法):方法是在小数表示法后面加字母E(或e)表示指数,指数部分可正可负,但必须是整数。
如:1e-2、0.5E10、35.56E-3、7.e-2,它们都是double(双精度浮点)型常量。
注意:用指数形式表示的浮点数必须有尾数,可以是整数或小数。
如:e4和.e3这样的写法都是错误的。
实型常量缺省是double类型。
单精度实型常量由数值后跟F或f来表示。
3.字符常量
由单引号括起来的一个字符。
字符常量两侧的单引号是必不可少的。
转义字符:以反斜线“\”开头,后跟一个字符或用八进制、十六进制表示的ASCII 码值组成。
使用时同样要括在一对单引号内。
转义字符表
字符形式转义功能
\n 回车换行(Enter)
\t 水平制表符(即跳到下一个输出区)
\v 竖向跳格
\b 退格(Backspace)
\r 回车
\a 响铃
\\ 反斜线字符(\)
\’单引号字符(’)
\”双引号(”)
\000 1~3位八进制数所代表的字符
\xbb 1~2位十六进制数所代表的字符
4.字符串常量
由一对双引号括起来的一个或多个字符序列。
字符串常量与字符常量的区别:一个字符常量在内存中存放,只占1 Byte,而字符串常量是用一个一维字符数组来存放的,即在内存中用多个连续的字节存放,每个字节放一个西文字符,或用2Byte放一个汉字,为了标志字符串的结束,系统自动在字符串的结尾加一个结束符(’\0’),这里的’\0’表示空字符的转义字符。
注意:字符串长度与字符串在内存中占用的字节数是两个不同的概念。
5.符号常量
用一个标识符号代表的一个常量,这时,此标识符号与此常量是等价的。
C语言中符号常量是用宏定义命令定义的。
定义符号常量的格式如下:
#define 标识符常量
编译程序在源程序中发现该标识符时,都用后面的常量来替换。
三、变量
变量:在程序执行中其值可发生变化的量称为变量。
1.标识符
标识符是由程序员定义的单词,用它来命名程序中的一些实体对象(如符号常量名、变量名、函数名、类型名、数组名等)。
C语言中标识符的命名规则:
(1)C语言规定标识符是由大小写英文字母、数字字符(0~9)和下划线(_)三种字符组成,且第一个字符必须为英文字母或下划线(以英文字母或下划线开头)。
(2)标识符区分大小写(大小写字母不一样)。
(3)长度任意(最少一个字符)。
(4)不能采用系统关键字(保留字)。
(5)标识符命名应以直观且易于拼读,即做到“见名知意”。
2.关键字
关键字是系统已定义的单词,它们在程序中有着不同的用途。
不能用它们再作其他之用。
下面列出常用的32个关键字,它们都是系统已定义的保留字,用户不能再用它们
定义如符号常量名、变量名、函数名、类型名、数组名等。
auto break case char continue const
default do double else enum extern
float for goto if int long
register return short signed sizeof static
struct switch typedef union unsigned viod
volatile while
注意:这些关键字用的都是小写字母。
3.变量的定义
在C语言中,变量必须遵循“先定义、后使用”的原则,即每个变量在使用之前都要用变量定义语句将其声明为某种具体的数据类型。
变量定义语句的格式:
数据类型变量名1 [,变量名2,……];
其中:“数据类型”包括基本数据类型和构造数据类型两类。
当一条变量定义语句定义多个变量时,变量名之间用逗号分割。
4.变量值
变量存在2个有用的值。
一个是变量所表示的数据值,另一个是变量的地址值。
变量赋初值:在定义变量的同时给变量赋一个初始值。
该变量被称为已初始化的变量。
其方法是在变量名的后面跟一个等号和一个常量值。
变量赋值:C语言中对变量的赋值可以采用下面的方法:
变量名=表达式;
四、数组
数组是一种构造类型,它是数目固定、类型相同的若干个变量的有序集合。
一个数组包含了若干个变量,每个变量称为一个元素,每个元素的类型都是相同的。
1.数组的定义
定义数组的格式如下:
数据类型数组名[下标1][下标2]…;
其中:“数据类型”用于说明数组中每个元素的类型;数据名用于标识该数组;下标的个数表明数组的维数。
1个下标表示一维数组,2个下标表示二维数组,以此类推。
定义数组时,“下标”必须是一个整型常量或整型常量表达式,不允许使用变量作为下标定义数组。
C语言规定不能定义动态数组,即不能定义数组元素个数不定的数组。
C语言中数组元素在内存中是按行存放的,即元素是一行一行连续存放的,存完第一行后存第二行,然后存第三行,……,以此类推。
2、数组元素的表示
C语言中,数组除了作为函数的参数外,不能整体引用,每次只能引用数组的一个元素。
数组元素与普通的变量一样,可出现在任何合法的C语言表达式中。
数组元素的表示格式如下:
数组名[下标1][下标2]……
这里的下标与数组定义时不同,它可以是整型常量,也可以是含有已复制变量的整型表达式。
下标的含义也不同,引用数组元素时给出的下标值代表元素在数组中的排列序号。
C语言中的数组下标从0开始。
C语言在编译和运行过程中不自动检测数组下标值是否越界。
3.数组的初始化
所谓数组的初始化就是在定义数组的同时,给数组元素赋初始值。
其方法是等号“=”后用一个初始化列表来实现。
初始化列表是一个用一对花括号({})括起来的若干个数据项组成的,多个数据项之间用逗号分隔。
数组赋初值时,数组元素的个数要大于等于初始化列表中数据项的个数,否则编译时将出错。
初始化列表中提供的初值的个数不能多于数组元素的个数,但可少于数组元素的个数。
当初始化列表中提供的初值个数少于数组元素的个数时,系统自动将后面的元素赋初值0。
当数组元素的初值全部列于初始化列表中时,可以省略对数组第一维长度的说明。
4.数组元素的赋值
5.字符数组
字符数组是指数组元素是char型的一种数组,字符数组也可以有一维、二维、三维和多维数组。
一维数组可以用来存放一个字符串,多维字符数组可以用来存放多个字符串。
C语言中只提供了字符数据类型,没有提供字符串数据类型,因而,字符串的存取完全依赖于字符型一维数组,即字符串是借助于字符型一维数组来存取的。
在存储字符串时,字符串结束标志“\0”也占用一个字节的存储空间,但它不计入字符串的实际长度。
一个一维字符型数组并不一定是一个字符串,只有当一维字符型数组的最后一个元数为“\0”时,它才构成字符串。
例如:
char str1[]={‘C’,’h’,’i’,’n’,’a’};
char str2[]={‘C’,’h’,’i’,’n’,’a’,’\0’};
str1仅仅是一个长度为5的字符数组,不能把它作为一个字符串来使用。
当将一个一维字符数组作为一个字符串使用时,可以用字符串直接初始化该数组。
如:
char str[6]={“China”};
也可以省略花括号,直接写成:
char str[6]=”China”;
这时,数组定义的长度应大于等于字符串中包括“\0”在内的字符个数,即应大于等于字符串的长度加1。
在定义数组时,若省略长度说明,则编译程序将自动按字符串的个数对数组大小进行初始化。
例如:
char str[]=”China”;
由于“China”是字符串常量,系统自动在其末尾加入“\0”,因此系统默认数组str的大小为6。
五、运算符和表达式
表达式是由运算符和运算对象组成的式子,运算对象就是在程序中要处理的各种数据。
最简单的表达式就是一个常量或变量。
在表达式中可以使用圆括号来改变优先级,任何一个表达式经过计算都应有一个确定的值和类型。
一个表达式的计算顺序是由运算符的优先级和结合性来决定的。
一个表达式的类型由运算符的种类和操作数(运算对象)的类型来决定。
C语言规定,只有同类型的数据才进行计算,不同类型的数据要先转换成同一类型,然后才进行计算。
(一)算术运算符和算术表达式
1、基本算术运算符
+、-、*、/、%(取余)
注意:%运算符只用于int型数据的运算,符号位取被除数的符号。
另外,两个整数相除(/),结果为一整数;分子小于分母,结果为0。
优先级:*、/、%同级,高于+、-。
结合性:自左至右
2、算术表达式
算术表达式是由算术运算符和操作数组成的表达式。
若表达式中的操作数类型不相同时,表达式的类型是各操作数中类型最高的类型。
3、数据类型转换
类型转换分为两种,一种是隐含转换(自动类型转换),另一种是强制转换。
强制类型转换:它是将某种类型强制性地转换为指定的类型。
格式如下:
(类型名)表达式
(二)赋值运算符和赋值表达式
1、赋值运算符
赋值运算符是一种能够改变变量值的运算符。
C语言中赋值运算符分为:简单的赋
值运算符和复合的赋值运算符。
简单赋值运算符只有一个:=(赋值运算符
复合赋值运算符共有10个:十=(加赋值)、一=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、&=(按位与赋值)、|=(按位或赋值)、^=(按位异或赋值)、<<=(左移位赋值)和>>=(右移位赋值)。
复合赋值运算符是先进行一种算术运算后,再进行赋值。
注意:赋值运算符的左边只能是变量,不允许是表达式。
结合性:从右至左的。
2、赋值表达式
由赋值运算符和操作对象连接组成的式子称为赋值表达式。
赋值运算符的数据类型若不一致,则要进行类型转换。
这也是一种强制类型转换,称为隐含类型转换。
方式为:在赋值表达式中,当左值(赋值运算符左边的值)和右值(赋值运算符右边的值)类型不同时,一律将右值类型强制转换为左值的类型。
(三)关系运算符和关系表达式
1、关系运算符
C语言中的关系运算符共有6个:
>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)和!=(不等于)
前面4个的优先级高于后面的两个。
2.关系表达式
由关系运算符和操作数组成的表达式称为关系表达式。
关系表达式的值是一个逻辑型的值,即只有2个值(真和假)。
这里要说明的是,C语言是用1作为真,用0作为假。
但是进行运算时,非0即认为真,0才认为假。
而表达式的结果为真时,给出真值1。
为假时,给出假值0。
关系运算符的结合性为:自左至右。
关系运算符的优先级低于算术运算符。
(四)逻辑运算符和逻辑表达式
1.逻辑运算符
逻辑运算符共3个:
单目逻辑运算符:!(逻辑求反);
双目逻辑运算符:&&(逻辑与)、||(逻辑或);
优先级:!>&&>||
2.逻辑表达式
由逻辑运算符连接关系表达式或逻辑量组成的表达式称为逻辑表达式。
逻辑表达式的值也是一个逻辑型,即只有真和假值。
用1作为真,用0作为假。
运算时,非0即认为真,0才认为假。
而表达式的结果为真时,给出真值1,为假时,给出假值0。
在由&&和||运算符组成的逻辑表达式中,c语言规定:只对能够确定整个表达式值所需要的最少数目的子表达式(操作数)进行计算。
即在由若干个子表达式(或操作数)
组成的一个逻辑表达式中,从左至右计算子表达式的值,当计算出一个子表达式的值便可确定整个逻辑表达式的值时,后面的子表达式就不再计算了。
(五)自增、自减运算符
自增、自减运算符:++,--。
这两个运算符都是单目运算符,也是一种能够改变变量值的运算符。
即它在计算表达式的值后,还将会改变其变量的值(使变量的值增1或减1)。
C语言的这两个运算符既可作用于一个变量的前面(前置运算),也可以作用于一个变量的后面(后置运算)。
不论作用于一个变量的前面,还是后面,都会使被作用的变量值加1或减1。
但作用于一个变量的前面,则该变量值先被加1或减1,然后该变量才被引用。
反之,如作用于一个变量的后面,则先引用该变量,然后该变量值被加1或减1。
注意:++、--运算符只能用于变量前或后
变量值与表达式值的区别。
(六)位操作运算符及表达式
位操作运算符是用来进行二进制位运算的运算符,只针对基本数据类型中的char和int型数据中的二进制位进行操作,不能对其他类型的数据操作。
C
运算符含义类型优先级结合性
~ 按位取反单目高从右向左
<<,>> 左移位、右移位双目从左向右
& 按位与双目从左向右
^ 按位异或双目从左向右
| 按位或双目低从左向右
右移位:x>>n表示将x每一位向右平移n位。
当x为有符号数时,左边空位补符号位上的值,即正数补0,负数补1。
这种移位称为算术移位。
当x为无符号数时,左边空位补0,这种移位称为逻辑移位。
(七)条件运算符和条件表达式
条件运算符是C语言提供的一个仅有的三目运算符,该运算符需要3个操作数,它的格式如下:
dl?d2:d3
其中:dl、d2和d3是3个操作数。
三目运算符的功能是先计算dl的值,根据该值进行判断。
如果为非0,则计算d2的值,并把该值作为条件表达式的值。
否则计算d3的值,并把该值作为条件表达式的值。
而表达式的类型为d2和d3中类型高的一个类型。
另外三目运算符结合性是自右至左。
(八)逗号运算符和逗号表达式
C语言把逗号(,)也作为运算符。
逗号运算符的功能是将多个表达式组成一个逗号表达式。
逗号运算符的优先级是所有运算符中最低的一个运算符。
逗号表达式运算规则是:从左至右依次计算各个表达式的值,最后计算的一个表达式的值和类型便是整个逗
号表达式的值和类型。
(九)sizeof运算符
sizeof是一个单目运算符,它的功能是返回变量名或给定的类型名所占内存字节的个数。
其引用的格式为:
sizeof变量名
或sizeof(类型名)
(十)运算符的结合性和优先级
六、数据的输入和输出
C语言中没有提供对数据的输入和输出语句,但提供了一些标准的输入输出函数,在编制的C语言程序中,对于数据的输入和输出,就是使用这些输入和输出标准函数来完成。
本小节只介绍4个基本输入和输出函数,即getchar()、putchar()、printf()、和scanf()。
(一)字符的输入输出函数getchar()/putchar()
getchar()与putchar()是两个用于字符输入输出的标准函数。
1.getchar( ) 函数
函数原型为:int getchar(void);
getchar( )函数没有参数(即括号内不填写任何内容),执行该函数时,机器等待用户从标准输入设备输入一个字符并返回其值,按回车键结束输入。
该返回值可以赋值给一个char型变量中,也可以直接作为一个操作数参与运算。
注意:getchar( )函数1次只能返回1个字符的值。
2.putchar( )函数
函数原型为:int putchar(int c);
putchar()函数带有一个char型参数(即在括号内填写一个char型表达式),执行该函数时,将括号内char型表达式的值,输出到标准输出设备(一般为显示器)的当前光标处。
说明:1.使用getchar()和putchar()函数应在源程序开头包含头文件stdio.h:
#include stdio.h
2.注意输入格式。
getchar将键盘上的任何按键都读入,如果连续使用getchar输入字符,字符之间不能有分隔符,包括回车键。
(二)格式化输入输出函数printf()/scanf()
这两个函数可以实现将表达式的值按照某种格式进行输入输出操作。
1.格式输出函数printf()
按照指定的格式输出数据。
其一般形式为:
printf(格式控制字符串,输出值参数表);
其中,格式控制字符串是用双引号括起来的字符串,一般包括两个部分:格式转换说明符和需要原样输出的普通字符。
输出值参数表中可以有多个输出值,之间用逗号分隔,也可以没有(当只输出一个字符串时)。
格式转换说明符是由“%”后加一个格式转换字符组成,用于指定个输出值参数的输出格式。
中间可以插入l、m、.n等格式修饰符。
转换字符作用
d 将对应参数转换成带符号的十进制形式输出整数
o 将对应参数转换成八进制无符号形式输出整数(不输出前导符0)
x 将对应参数转换成十六进制无符号形式输出整数(不输出前导符0x)
u 将对应参数转换成无符号十进制形式输出整数
c 将对应参数转换成无符号形式输出一个字符
s 输出字符串
f 将对应参数转换成小数形式输出单、双精度数,隐含输出6位小数
e 将对应参数转换成指数形式输出单、双精度数
g 选用%f或%e格式中输出宽度较短的一种格式
%% 表示%本身
普通字符:照原样输出。
格式控制字符串中格式转换说明的个数应与后面的参数个数相等,执行时,按格式转换说明的先后次序与后面的参数一一对应地进行格式转换。
格式修饰符作用
l 用于长整型数据,可加在格式符d, o, x, u前面
最小域宽m (整数) 指定输出项输出所占的列数(宽度)
若m为正整数,当输出数据宽度小于m时,在域内向右对齐,左边多余位补空格;当输出数据宽度大于m时,按实际宽度全部输出;若m前有前导符0,则左边多余位补0
若m为负整数,则输出数据在域内向左对齐
输出精度.n (大于等于0的整数)精度修饰符位于最小域宽修饰符之后,由一个小数点及其后的整数构成对于浮点数,用于指定输出的浮点数的小数位
对于字符串,用于指定从字符串左侧开始截取的子串字符个数
说明:用m.n的形式输出浮点数时,.n指明输出的小数位数,如果m-n-1小于浮点数的整数部分,则整数部分原样输出,此时,输出域宽会大于m。
即:当域宽小于参数的实际长度时,域宽不起作用,按参数的实际长度输出。
2.格式输入函数scanf()
格式输入函数scanf()的功能是:接收从标准输入设备(键盘)输入的若干个任意类型的数据。
其一般格式如下:
scant(格式控制字符串,参数地址表);
格式控制字符串:用双引号括起来的字符串,由格式转换说明符和普通字符构成。
格式转换说明符是由“%”后加1个转换字符组成,中间也可插入1、m、h和*几个格式修饰符。
参数表是由若干个变量的地址组成的列表,参数之间用逗号分隔。
注意:scanf函数要求必须指定用于接收数据的变量的地址,否则,虽然编译程序不会给出错误,但会导致数据不能正确输入到指定的内存单元。
说明符作用
d 用来输入十进制整数
o 用来输入八进制整数
x 用来输入十六进制整数
c 用来输入单个字符,空白字符(包括空格、回车、Tab符)也作为有效字
符输入
s 用来输入字符申,在输入时以非空格字符开始,遇到第一个空格字符结束
f 用来输入实数,可以用小数形式或指数形式输入
e 与f作用相同
当有多个数据输入时,scanf()函数的默认分隔数据符为空格、Tab或回车(Enter)。
对于单个字符的输入时,分隔符不起作用。
修饰符作用
字母1 加在格式符d、o、x、u前面,用于输入长整型数据
加在f、e前面,用于double型数据
m(代表一个
指定输入数据的宽度(域宽),系统自动按此宽度截取所需数据正整数)
* 表示本输入项在读入后不赋给对应的变量
字母h 用于输入短整型数据(short型)。