C言C语之数据类型、运算符与表达式

01--C语言的数据类型

数据类型一般是按照被定义变量的性质、表现形式、占据的内存大小、构造特点来进行划分的。

C语言中,数据类型分为:基本数据类型、构造数据类型、指针类型、空类型四大类。

基本类型又分为:整型、字符型、实型(或浮点型)、枚举类型。

实型(或浮点型)分为:单精度型、双精度型。

构造类型又分为:数组类型、结构体类型、共用体类型。

①基本数据类型:其值不可以再分解为其它类型。

②构造数据类型:一个构造类型的值可以分解成若干个成员或者元素。每个成员都是一个基本数据类型或者又是一个构造类型。

③指针类型:其值用来表示某个变量在内存存储器中的地址。

④空类型:在调用函数值时,通常应向调用者返回一个函数值,也有一类函数,调用后不需要向调用者返回函数值,这种函数可以定义为“空类型”,其类型说明符为void。

02--常量与变量

对于基本数据类型,按其取值是否可以改变又分为常量和变量两种。他们可以和数据类型结合起来再分类:整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量等。

在程序中,常量是可以不声明直接引用的,而变量需要先声明。

①常量和符号常量

直接常量:整型常量5、-9、6,实型常量2.1、 3.14,字符常量‘a’ 、‘d’

标识符:用来标识变量名,符号常量名、函数名、数组名、类型名、文件名的有效字符序列。

符号常量:用标识符代表一个常量。

符号常量在使用之前需要先进行定义,形式为

#define 标识符 常量

上面的#define是预处理命令,其功能为在后续程序中,出现的所有标识符都由该常量值代替。

从习惯上,符号常量的标识符都用大写字母来表示,而标量的标识符则用小写字母。

符号常量与变量不同,其值在其作用域内不能改变,也不能再被赋值。

使用符号常量的好处是,含义清楚,能做到改一个,改全部。

②变量

变量定义必须放在变量的使用之前,一般放在函数的开头部分。

03--整型数据

①整型常量的表示方法

在C中,使用的整型常数有,8 、 10 、 16进制3种。

十进制:225,265,-55

八进制:八进制整数常数必须以0开头,作为其前缀,八进制数通常为无符号数。015,0111,0177

十六进制:其前缀为0X或0x,0X2A,0XABC

后缀:长整型常数,无符号数等。0XA5L,358u,0x32Lu,0x37Au

②整型变量

(1)整型数据在内存中的存放形式

任何数据的存放都是二进制的格式,并且数值是以补码的形式表示的。

正数的补码与原码相同,负数的补码,将该数的绝对值的二进制形式按位取反再加1。

(2)整型变量的分类

不同操作系统,int、long等数据类型的字节数有差异。

基本型:说明符int,一般占用2字节

短整型:说明符short int 或short,字节数与int相同

长整型:说明符long int 或long,占4个字节

无符号型:基本型unsigned int或 unsigned,短整型说明符unsigned short,长整型unsigned long

③整型变量的定义

定义变量的一般形式:

类型说明符 变量名标识符,变量名标识符,......;

unsigned a,b;

④整型数据溢出

与编译器环境有关

04--实型数据

①实型常量的表示方法

实型也称之为浮点型。实型常量也称为实数或者浮点数。在C中,实数只采用十进制,他有2种形式,即十进制小时和十进制指数。

例如:0.32,3.14159,-2.225

指数形式:由十进制数,加阶码标志e或者E以及阶码组成(阶码只能为整数,可以带符号)

其形式为:a E n = a*10的n次方

例如:3.1E6 = 3.1*10^6  -2.4e-3 = -2.4*10^-3

在C中允许浮点数使用后缀f或者F,225f与225.等价。

②实型变量

(1)实型数据在内存中的存放形式

实型数据一般占用4个字节(32位)的内存空间,按指数形式存储。实数3.14159的存放形式为:

+       0.31416     1

数符  小数部分  指数

小数部分占得位(bit)数愈多,数的有效数字越多,精度越高

指数部分占得位数越多,则能够表示的数值范围越大。

(2)实型变量的分类

实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)3类。

单精度型占4个字节(32位),其数值范围位3.4E-38~3.4E+38,只能提供7位有效数字。双精度占8个字节(64位),其取值范围为1.7E-308~1.7E+308,可以提供16位有效数字。

(3)实型数据的舍入误差

实型变量能够提供的有效数字总是有限的,故一个数字在存储时总是会有舍入现象。

例1:

main()

{

float a,b;

a = 123456.789e5;

b = a+20;

printf("%f , %f\n",a,b);

}

输出的结果为:

12345678848.000000

12345678848.000000

例2:

main()

{

float a;

double b;

a = 33333.33333;

b = 33333.33333333333333;

printf("%f\n%f\n",a,b);

}

输出结果为:

33333.332031

33333.333333

由于a是单精度浮点型,有效数字为7位,整数占5位,故小数2位后面均为无效数字。

b是双精度,有效位为16位,但是C规定小数后最多保留6位,其余部分四舍五入。

③实数常数类型

实型常数不分单双精度,都按照双精度double类型处理

05--字符型数据

字符型数据包括字符常量和字符变量。

①字符常量

例:

‘f’,

字符常量只能用单引号括起来,不能用双引号或其他括号

字符常量只能是单个字符,而不能是字符串

字符可以是字符集中的任意字符,但是数字被定义为字符型之后就不能再参与数值的计算。比如3和‘3’是不同的,因为‘3’是字符常量,不能参与运算。

②转义字符

转义字符是一种特殊的字符常量。转义字符以反斜线“\”开头,后面跟一个或几个字符,转义字符含有特定的含义,不同于原有的字符含义。例“\n”是一个转义字符,其意义为回车换行。

C言C语之数据类型、运算符与表达式_第1张图片

③字符变量

字符变量用来存储字符常量,即单个字符

类型说明符为 char

例:  char x,y;

④字符数据在内存中的存储形式及使用方法

每个字符变量会被分配一个字节的存储空间,只存放一个字符。字符的值是以ASCII码的形式存在变量的内存单元中。

如x的十进制ASCII码为120,对字符变量a赋值

a = 'x';

实际上是在a的单元内存放的120的二进制码。

即01111000

所以可以把字符量看成是整型量,C语言允许对整型变量赋以字符值,也可以对字符变量赋以整型值。并且在输出时,允许把字符变量按照整型变量输出,反之亦可。

但有点区别需要注意,整型量为2字节,而字符量为单字节,当整型量按字符量处理时,只有低8位参与计算。

⑤字符串常量

字符串常量是由一对双引号括起来的字符序列。例如“Beijing”、“RMB255”

字符串常量与字符的区别:

1.字符常量单引号括起来,而字符串常量由双引号括起来

2.字符串常量只能是单个字符,字符串常量则由一个或多个字符

3.可以把一个字符常量赋值给字符变量,但不能把一个字符串常量赋值给一个字符变量

4.字符常量占用一个字节的内存空间,而字符串常量占用的内存字节数等于字符串中字节数+1,增加的一个字节用来存放字符“\0”,这是字符串结束的标志。

例:

字符常量'x'     字符串常量"x"

在内存中的情况   x      x  \0

06--变量赋初值

赋初值的一般形式:

类型说明符  变量1 = 值1,变量2 = 值2,......;

在定义中不允许连续赋值,如 x=y=z=7;

07--各类数值型数据之间的混合运算

变量的数据类型是可以转换的,转换分为自动转换和强制转换。

自动转换由编译系统自动完成,强制转换是通过类型转换运算来实现的。

自动转换:

1.若参与运算量的数据类型不同,先转换成同一类型,然后再进行计算

2.转换按照数据长度增加的方向进行,以保证精度不丢失,如int和long进行计算时,先把int转为long再计算

3.所有的浮点运算都是以双精度进行,仅含有float的单精度运算的表达式也需要先转换成双精度再运算。

4.char和short类型在进行运算前,都需要先转换int型

5.在赋值运算中,当等号两边的数据类型不同时,赋值右边的类型将自动转换为等号左右的数据类型。当右边的数据类型长度大于左边时,将会丢失一部分数据,丢失的部分按照四舍五入向前舍入。

强制转换:

其一般形式:

(类型说明符)(表达式)

例:

(float)x          (int)(a-b)

1.类型说明符和表达式都必须加括号(单个变量可不加)

2.不论是强制还是自动转换,都是在本次运算时进行的临时性转换,不改变声明时对该变量的数据类型。

08--算术运算符和算术表达式

①C运算符简介

1.算术运算符用于各类数值的运算

+  -  *  /   %(求余或称模运算)++  -- 共7种

2.关系运算符用于比较运算

>  <   ==   >=  <= != 共6种

3.逻辑运算符用于逻辑运算

&&  ||   !  3种

4.位操作运算符,参与运算的量,按二进制位进行运算

&  |  ~  ^(位异或) <<(左移)  >>(右移)  6种

5.赋值运算符用于赋值运算

简单赋值 =    复合算数赋值+=,~=,*=,/=,%=

复合位运算赋值  &= ,|=,>>=,<<=  11种

6.条件运算符

三目运算符用于条件求值   a?b:c

7.逗号运算符

用于把若干表达式组合成一个表达式(,  )

8.指针运算符

用于取内容(*)和取地址(&)2种运算

9.求字节数运算符

用于计算数据类型所占的字节数(sizeof)

10.特殊运算符

括号(),下标,成员(→, .)等

②算术运算符和算术表达式

(1)基本的算术运算符

"+"   双目  右结合性

"-"  双目,作为负值运算符时,单目,左结合性

"*" 双目  左结合性

"/"  双目  左结合性  运算量均为整型时,结果也为整型,舍去小数。如果运算中有一个是实型,则结果为双精度实型。

例10/3  结果为3

"%" 双目运算符,左结合性,要求参与的量均为整型

(2)算术表达式和运算符的优先级和结合性

表达式是由常量、变量、函数和运算符组合的式子。表达式求值按照运算符的优先级和结合性的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。

算术表达式:是由算术运算符和括号连接起来的式子。

1.算术表达式:

x+y    (c*2)/2  ++p  sin(s)+cos(u) 

2.运算符的优先级

C语言中,运算符的优先级分为15级,优先级高的要先于优先级低的进行运算,若一个运算两侧的优先级相同时,则按结合性的方向处理。

3.运算符的结合性

分为2种,左结合和右结合

左结合:

例a+b-c,  先执行a+b  得到的值再和c运算

右结合:

a=b=c 先执行b=c,得到的值再与a运算

(3)自增,自减运算符

++i   i自增1后再参与其他运算

--i   i自减1后再参与其他运算

i++  i参与运算后,i的值再自增1

i--  i参与运算后,i的值再自减1

09--赋值运算符和赋值表达式

①赋值运算符

其一般形式为:

变量=表达式

a = b = c = 0  等价于 a=(b=(c=0))

表达式

x=(a=5)+(b=2)

x应为7

②类型转换

1.实型赋予整型,舍去小数部分

2.整型赋予实型,数值不变,将以浮点形式存放,即增加小数部分(0)

3.字符型赋予整型,由于字符型为单字节,整型为2字节,故将字符的ASCII码值放到整型的低八位中,高八位为0。

③复合的赋值运算符

构成复合赋值表达式的一般形式为:

变量  双目运算符 = 表达式

等价于

变量 = 变量 运算符 表达式

例:

x-=3

a*=b+2

b%=o

10--逗号运算符和逗号表达式

逗号表达式其功能为把两个表达式连接起来组成一个表达式,一般形式为

表达式1,表达式2    (可以嵌套)

其求值过程是分别求两个表达式的值,最后以表达式2的值作为整个逗号表达式的值。

你可能感兴趣的:(C言C语,c语言,开发语言)