Chapter 3——C语言的数据类型,标识符和表达式

3.1 C语言的基本符号

3.1.1 标识符

程序中用来为符号常量、变量、函数、数组、类型、文件命名的有效字符序列成为标识符

C语言中关于标识符的命名规则:

①只能由字母数字下划线组成

②第一个字符必须为字母或者下划线

③不能使用关键字

建议标识符的长度不要超过八个字符

3.1.2 常量

常量又称常数,是程序运行过程中其值不能改变的量。

常量的数据类型是由本身隐含决定的。

        例如,25、0、-13为整型常量;-55.23、0.57、3.8e3为实型常量;'B'、'9'为字符型常量。

在程序中,符号常量名习惯采用大写字符

        #define PI 3.1415926

3.1.3 变量

1.变量的基本概念

在程序运行中,其值可以改变的量就叫做变量。变量有数据类型、变量名和变量值三个属性。变量在其存在期间,在内存中根据指定的类型所占据的存储单元长度的不同,可以用来多次存放不同的值。

变量名的命名规则与标识符完全相同

①只能由字母数字下划线组成

②第一个字符必须为字母或者下划线

③不能使用关键字

变量名和变量值的概念不同,变量名实际上是一个符号地址,在系统对程序进行编译时,给每一个变量名分配一个具体的内存地址,变量值对应变量名的存储单元所存放的具体的数值。

如下图所示:

变量的数据类型是指变量可以存储的数据的类型,也就是变量值的数据类型

在程序中,变量名在其有效范围内不能更改,但是变量值却可以动态更新。

#include<stdio.h>

int main(){
    int k = 100;

    k = 20;
    printf("%d",k);
    return 0;
}

再次给变量赋值时,新值将代替旧值。

程序在使用变量时,先要对变量进行定义,即必须“先定义,再赋值,后使用”。

2.变量的定义

变量的定义是在程序中指定变量的名字和数据类型

int x = 10;
double y = 53.25;
char s = 'I love you';
3.变量的初始化

在C语言中,定义变量的同时还可以为变量指定初值,这个过程称为变量的初始化。

例如:

float a = 1.4;
char str = 'a';

也可以对定义的变量,部分赋初值:

int i,j=0,k=3;

以下是不允许的:

int i=j=k=0;

但是这样是允许的:

int i,j,k;
i=j=k=0;

3.1.4 关键字

C语言规定的一些具有特殊意义的英文单词或单词缩写。

3.2 C语言的数据类型

C语言将能处理的数据分为两大类型:基本类型和构造类型。

构造类型的数据是由若干个基本类型或构造类型以一定的结构组合而成。

3.2.1 整形数据

1. 整型变量

有三类:基本整型 int , 短整型  short int , 长整型long int 或 long做类型说明符。

用来定义带符号(正、负号)的整型变量。

而将符号位去掉,将整个存储单元中的全部二进制位都用来存放数,这类变量称为无符号整型。

还是三类:无符号基本整型 unsigned int或unsigned, 无符号短整型unsigned short int或unsigned short, 无符号长整形unsigned long int或 unsigned long 作为类型说明符。

无符号整型变量不能存放负数,因此其存放的正数的范围比相应的有符号整型变量大一倍。

2. 整型常量

整型常量就是整常数。有以下三种表现形式:

①:十进制数,例如567,0,-89

②:八进制数,以数字0开头,并由数字0-7组成的数字序列,例如0125,011。八进制数在、0125转换成十进制就是85。

③:十六进制数:以0x或0X开头,并由数字0-9和字符a-f或者字符A-F组成的数字序列。习惯上,0x开头时用小写字母,0X开头时用大写字母。

整型常量的类型:

整型变量有六种类型,整型变量的类型是由其本身隐含决定的,当然也和所选的编译系统有关系。

应当注意以下几点:

①:常量没有unsigned 型,但是如果非负的整数在unsigned型的取值范围内,可以赋值给一个unsigned型变量。

②:一个常整量后面加一个字母L或者小写的l,则明确指定该常量时long int 类型的。例如123L。这种处理方式往往用于函数调用时参数传递过程中的。

3.2.2 实型数据

C语言的实型用来表示实数。

计算机只能表示有限位的实数,所以实型实数的一个有限子集

1.实型变量
1. 实型变量的分类

按数值的取值范围,分为三类:

①单精度实型:float作为类型说明符

②双精度实型:double作为类型说明符

③长双精度实型:long double作为类型说明符

在大多数C系统中:

float 占四个字节, double 占八个字节 , long double 占16个字节。

也就是,32位,64位,128位。

如下表所示:

类型名称类型说明符字节数位数有效数字数值范围(绝对值)
单精度实型float4326-710e-38——10e38
双精度实型double86415-1610e-308——10e308
长双精度实型long double1612818-1910e-4932——10e4932

在C语言中,实型(即浮点型)数据通常使用floatdoublelong double类型来表示。它们的取值范围取决于多个因素,包括:

  1. 数据类型:不同的数据类型(如floatdoublelong double)在内存中占用不同的字节数,因此能够表示的数字范围和精度也不同。
  2. IEEE 754标准:大多数现代计算机和编译器都遵循IEEE 754标准来表示浮点数。该标准定义了浮点数的格式和运算规则。
  3. 指数和尾数:浮点数通常由符号位、指数位和尾数位组成。指数决定了数的大小范围,而尾数决定了数的精度。

2. 实型变量的定义

每一个实型变量都要在使用前进行定义

float a = 0.55;
double c = 114514;
long double k;
2.实型常量

1.实型常量的表达形式

有以下两种表达形式:

①十进制小数形式:例如0.0125,0.533;

②指数形式:一般格式是 实数(整数) +  e(或E) + 整数。

例如:1145.14的指数形式就是 1.14514e3

2.实型常量的类型

许多C系统都将实型常量作为双精度来处理,例如:

float x;

x=1.23456*6543.21;

系统将1.23456和6543.21按双精度存储(占64位)和运算,得到一个双精度乘积,然后取前七位赋给变量x,这样可以保证计算结果更精确,但是降低了运算的速度。同时编译器会给出变量x和乘积常量类型不一致的警告,因此为了提高运算速度和避免编译时出现警告,可以在实数常量的后面加字母f(或者F),例如x=1.23456*6543.21f,这样系统就会将1.23456和6543.21按单精度存储(占32位)和运算。

一个实型常量可以赋给一个float、double型或者long double型变量,系统根据变量的类型自动截取实型常量中的有效数字。

#include<stdio.h>
int main(){
    float a;
    double b;
    a=1234.111111f;
    b=1234.111111;
    printf("\na=%f,b=%f\n",a,b);
    return 0;
}

运行结果:

a=123.111084  ,b=1234.  111111

由此可以看出,由于float变量只能接受7位有效数字,因此最后三位是不准确的;而double型变量b能够接受全部的十位数字。产生这种现象的原因是实数在内存中是以指数形式存放的。IEEE 754标准定义了浮点数的表示方法,其中浮点数被分解为三个部分:符号、指数和尾数(或称为有效数字或分数)。这种表示方法允许浮点数表示非常大的数、非常小的数以及介于两者之间的数,但精度受到尾数位数的限制。在例子中,由于float类型的精度限制,它只能保留a变量的前几位有效数字,而后面的数字则会被舍入或截断。相反,double类型由于有更高的精度,能够更准确地表示b变量的值。

3.2.3 字符型数据

字符型数据用于表示一个字符值,字符型数据在计算机内部的表示形式是字符的ASCII码(二进制形式存储),并非字符本身。字符型数据分为字符常量和字符变量两种。

1.字符常量

用单撇号括起来的一个字符,例如:'a'、'A',还有一些特殊的字符,C语言约定用“\”开头的字符序列做标记,这类字符统称为转义字符。

 2. 字符变量

用来存放一个字符常量的变量成为字符变量。字符变量在使用之前必须首先定义,以char作为类型说明符。

无论是字符常量还是字符变量,在内存中都只占一个字节,用来存放一个字符。

虽然字符在程序中可以用字符常量或者对应的ASCII码的形式表示,但是在内存中是以其ASCII码二进制的形式储存的,它与整数的存储形式相类似。因此,在C程序中,字符型数据可以当作整型数据进行处理,并且可以与整型数据混合操作和处理。字符型数据可以用字符格式输出,显示字符本身,也可以用整数形式输出,显示字符的ASCII码值。

3. 字符串常量

字符串常量是括在一对双撇号之间的字符序列(其中也可以包括转义字符)。例如,“language”、“s”、“\tChins\ba\n”。

字符串常量中的字符依次存放内存中一块连续的区域内,并把空字符'\0'(ASCII值为0)自动地附加到字符串的尾部作为字符串结束的标志。因此,对于字符个数为n的字符串,所占内存空间应该为n+1个字节。

在程序中,可以用字符常量(单撇号)或字符串常量(双撇号)表示单个字符,例如'a'或"a",两者的区别如下,

①字符串"a"在内存中占两个字节,而字符'a'在内存中占一个字节。

②不能将字符串赋给一个字符变量。

例如:

char ch1, ch2;
ch1 = 'a'; /*正确*/
ch2 = "a";/*错误*/

3.3 运算符和表达式

运算是对数据进行处理和操作的过程,描述各种处理和操作的符号成为运算符(也称为操作符)。

用运算符将操作对象连接起来,符合C语言语法的式子称为表达式。表达式具有以下特点:

1.常量和变量都是表达式,例如常量2.61、变量 i 都是表达式。

2.运算符的类型对应表达式的类型,例如算术运算符对应算术表达式。

3.每一个表达式都有自己的值

        表达式的值也可以说是表达式的运算结果,所有表达式的值只有两类:数值和地址。不管表达式多么复杂,非地址类表达式的运算结果就只能是一个数值。

任意一个运算符都具有两个属性:优先性和结合性(结合方向)

1.优先性:当若干个运算符同时出现在表达式中时,优先级规定了运算的先后次序。如同算数运算中的先乘除,后加减一样,乘除的优先级高于加、减运算符。由于C语言的运算符种类很多,所以优先级有15级之多。C语言把圆括号作为运算符,规定它的优先级最高,15级,从而保证优先运算圆括号内的式子,逗号运算符的级别最低,一级。

2.结合性:当若干个具有相同优先级的运算符相邻出现在表达式中时,结合方向规定了运算的先后次序,分为“从左到右”和“从右到左”两个结合方向。

        一般来说,大多数运算符的结合方向为“从左到右”,只有单目运算符、赋值运算符和条件运算符的结合方向为“从右到左”,这里单目运算符是指作用于一个操作对象的运算符。

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

C语言基本的算术运算符有5个:

符号说明优先级结合性
+单目取正14从右到左
-单目取反14从左到右
*13
/13
%取余13
+12
-12

说明:

1. + -  *与数学中的意义相同。

2.在除法运算中,两个整数相除的结果为整数,舍掉小数部分。如果被除数和除数中有一个是负数,则舍弃小数部分的方向是不一定的。例如-9/2的运算结果可能为-5或-4.一般采用“向零取整”的规则,取整时向零靠拢。例如9/2的运算结果为4,-9/2的运算结果为-4.

3.%是取余运算符或模运算符,该运算只能作用于两个整型数,运算结果是两个整数相除后的余数,运算结果为整数。同时,规定运算结果的正负号与被除数一样,如果被除数小于除数,运算结果等于被除数。

3.3.2 赋值运算符和赋值表达式

C语言采用赋值运算的方式改变变量的值,或者说为变量赋值。赋值运算符有一般形式和复合形式两种。

1.一般赋值运算符和赋值表达式

赋值运算符是符号“=”,它的作用是将一个数据赋给一个变量。由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。一般形式如下:

变量 = 表达式

其作用是把赋值运算符右边表达式的值赋给赋值运算符左边的变量。

说明:

①赋值运算后,变量原来的值被表达式替换。

②赋值表达式的值也就是赋值运算符左边变量得到的值。如果右边表达式的值的类型和左边变量的类型不一致,以左边变量的类型为基准,将右边表达式的值的类型无条件地转换为左边变量的类型,相应的赋值表达式的值的类型与被赋值的变量的类型一致。

③赋值运算符的优先级很低,仅高于逗号运算符。结合方向为“从右到左”

2.复合赋值运算符和赋值表达式

为了使程序书写简洁和便于代码优化,可在赋值运算符的前面加上其他常用的运算符。

复合赋值运算符包括:

+=、-=、*=、/=、%=(与算术运算有关)

<<=、>>=、&=、^=、|=(与位运算有关)

3.3.3 逗号运算符

在C语言中,逗号不仅仅可以作为分隔符出现在变量的定义、函数的参数表中,还可以作为一个运算符把多个表达式连接起来,形成逻辑上的一个表达式。

逗号运算符优先级最低,结合方式“由左往右”。逗号运算符的功能是使得逗号运算符的各个表达式从左到右逐个运算一遍,逗号表达式的值和类型就是最右边的“表达式n”的值和类型。

3.4 数据类型转换

3.4.1不同数据类型的数据间的混合运算

整型,实型和字符型数据可以进行混合运算,在进行运算时,一般类型的数据先转换成标准的数据,不同类型的数据要先转换成相同类型的数据。

如下表所示:

一般类型转换为标准类型级别

char

short int

int

int从上往下,由低到高

unsigned int

unsigned short int

unsigned int
long intlong int
unsigned longunsigned long

float

double

double

说明:

1.在运算过程中每个数据都要转换为标准类型,以提高运算精度。例如,如果一个数据是float类型,首先应该转换为double类型。

2.通过第一步转换后,如果参与运算的数据类型仍不相同,不同类型的数据要先转换成同一类型的数据,然后进行运算。转换的规则是由低到高,也就是说一个表达式的值的类型是其中各个参与运算的数据中级别最高的类型。这一步可以由系统自动进行,称为隐式类型转换。

3.4.2 强制类型转换

强制类型转换是指将表达式的运算结果(即表达式的值)转换为指定的类型。

一般形式如下:

(类型说明符)表达式

 说明:

1.对表达式进行强制类型转换时,表达式应该用括号括起来,否则会产生不同的结果。

2.对变量进行强制类型转换时,只能得到一个中间值,并不改变该变量原有的类型

3.强制类型转换运算符的优先级高于取余运算符%

3.5 自增运算和自减运算

自增运算符++和自减运算符--是C语言特有的单目运算符,它们只能和一个单独的变量组成表达式。自增、自减运算符的运用的一般形式如下:

++变量或--变量

变量++或变量--

其作用是使变量的值增1或者减1,其中的变量是值算术类型的变量。

在其他表达式中出现时,x++和++x的值不同:表达式++x的值等于x的原值加1,表达式x++的值等于x的原值。换句话说,++x是将x加1后,再在其所在的表达式中使用x的值,而x++是在其所在的表达式中先使用x的值完成计算后,然后再将x的值加1.

说明:

1.自增运算符++和自减运算符--只能用于变量,不能用于常量和表达式。

2.自增运算符++和自减运算符--的结合方向是“从右到左”,优先级为14,仅次于圆括号。

3.自增运算和自减运算实质上是算数运算和变量赋值运算两种运算的结合。

3.6 位运算

C语言是为开发系统软件而设计的,因此它提供了操作二进制数的功能,这些功能通常只有汇编语言才具备。

符号说明优先级结合性
~位取反14从右到左

<<

>>

左移

右移

11从左到右
&位与8
^位异或7
|位或6

假设A和B是两个整型表达式。以后凡是提到A和B的值,都是指其二进制形式。

1.按位取反运算符~

一般形式:

~A

 功能:把A的各位都取反,1变0,0变1后所得到的值。

2.按位与运算符&

一般形式:

A&B

 功能:将A的各位与B的对应位进行比较,如果两者都为1,A&B对应位上的值位1,否则为0。

3.按位或运算符|

一般形式:

A|B

功能:将A的各位与B的对应位进行比较,如果两者中至少有一个为1,A|B对应位上的值为1,否则为0.

4.按位异或运算符^

一般形式:

A^B

功能:将A的各位与B的对应位进行比较,如果两者不同,A^B对应位上的值为1,否则为0。

5.左移预算符<<

一般形式:

A<<n

其中n为一个整型表达式,且大于0

功能:把A的值向左移动n位,右边空出的n位用0填补。当左移时移走的高位中全是0时,这种操作相当于对A作n次乘以2的运算。

6.右移运算符>>

一般形式:

A>>n

其中n为一个整型表达式,且大于0

功能:把A的值向右移动n位,左边空出的n位用0(或者符号位)填补。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值