博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小甲鱼笔记C语言入门(一)——数据类型,运算符和表达式
阅读量:3506 次
发布时间:2019-05-20

本文共 4947 字,大约阅读时间需要 16 分钟。

一、 C的数据类型

  • 基本类型:整型,字符型,浮点型(单精度型,双精度型),枚举类型

  • 指针类型

  • 构造类型:数组类型,结构体类型,共用体类型

  • 空类型

  1. 基本数据类型:主要特点,其值是不可分解。基本数据类型是自我说明的
  2. 构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造方法来定义的。一个构造类型的值可以分解成若干个”成员“或元素,也就是若干个基本数据类型集合在一起
  3. 指针类型:用来表示某个变量在内存存储器中的地址。虽然指针变量的取值类似于整型量。但不完全相同
  4. 空类型:在调用函数值时,通常使用void。

二、 常量与变量概念区别

对于基本数据类型量,按其取值是否可以改变又分为常量和变量两种。

在程序执行时,其值不发生改变的量称为常量,其值可变的量称为变量

三、 常量与符号常量

用标识符代表表示一个常量称为符号常量,一般形式为:

#define 标识符(符号常量) 常量
  • #define也是一条预处理命令(预处理命令都是以”#”开头),称为宏定义命令。其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值

  • 习惯上常量的标识符用大写字母,变量标识符用小写字母

#define PRICE 30void main(){
int num,total; num =10; total =num*PRICE; printf(“%d”,total);}

四、 变量

  • 其值可以改变的量称为变量

  • 一个变量应该有一个名字,在内存中占据一定的存储单元。

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

  • 要区分变量名和变量值是两个不同的概念

    在这里插入图片描述

五、 整型数据

1.整形常量的表示方法

整形常量就是整常数。在C语言中,使用的整常数有八进制十六进制十进制

  • 十进制整常数没有前缀。其数码为0~9。如:237,-568等
  • 八进制整常数必须以0开头,数码取值为0~7。如:015(十进制13),0101(十进制65)
  • 十六进制整常数必须以0X或0x。数码值0~ 9,A~ F或a~f。如:0X2A(十进制42)
  • 整型常数的后缀:基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0~ 65535,有符号数为-32768~ +32767。八进制无符号数的表示范围为0~ 0177777。十六进制无符号数的表示范围为0X0~ 0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示

2.整形变量

变量的存储方法在上面的变量的概念中已经提到。其数值是以二进制的形式保存的。

在这里插入图片描述
一个字节BYTE=8bit

变量的值是以补码来表示的:

  • 其中正数的补码和原码相同
  • 负数的补码:将该数的绝对值的二进制形式按位取反再加1。
如:求-10的补码?		10的原码:00001010		取反:11110101		加一:11110110(第一位是符号位)

3. 整型变量的分类

  • 基本型:类型说明为 int ,在内存中占4个字节。

  • 短整量:类型说明符为 short int 或 short 。2个字节

  • 长整型:类型说明为 long int 或 long ,在内存中占4个字节。4个字节

  • 无号型:类型说明符为 unsigned 。无符号短2字节,无符号长4字节

int a,b,c;unsigned d;

4. 整型数据的溢出

#include 
void main(){
short int a,b; a=32767; b =a+1; printf(“%d”,”%d\n”,a,b);}

输出结果为:32767,-32768

如果我们的编译器为16位

  • 32767转换为二进制为:0111111111111111(2的十五次方-1,这里的开头0表示正负号,0表正数,1是负数)
  • 加一变为32768转换为二进制为:1000000000000000。
  • 出现溢出的时候,会从最大点跳回到最小的点(这时,他的前面应该再多一个0或者1,用于表示正负号也就是17位,但是只有16位字符)

六、 实型常量(Float)

  • 实型常量也称为实数或者浮点数。

  • 在 C 语言中,实数只采用十进制。它有二种形式:十进制小数形式,指教数形式

  • 十进制数形式:也数码09和小数点组成。例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均为台法的实数。注意,必有小数点。

  • 指数形式:由十进制数,加阶码标志“ e ”或“ E ”以及阶码(只能为整数,可以带号)组成。其一般形式为: aEn ( a 为十进制数, n 为十进制整数)例如“2.1E5(2.1105),3.7E-2(3.710-2)

1. 实型数据在内存中存放形式

实型数据一般占4个字节(32位)内存空间。按照指数形式存储.如:3.14159在内存中。

在这里插入图片描述这里的符号位1位,小数部分2~8位(包含指数符号位),指数部分24位。

  • 小数部分占的位(bit)数越多,说明有效数字越多,精度也就越高

  • 指数部分占的位数越多,则表示数组范围越大

2. 实型变量的分类

  • 单精度(float型).4个字节(32位)

  • 双精度(doule)8个字节(64位)

  • 长双睛度(long double)16个字节(128位)

3. 实型数据的舍入误差

由于实型变量是由有限的存储单元组成,因此能提供的有效数字总是有限的。

#include 
void main() {
float a, b; a = 123456.789e5; b = a + 20; printf("%f",a); printf("%f",b);}

两次输出结果均为12345678848.000000。

因为此处发生了舍入误差,因为只把我们前面符合的数字。

七、 字符型数据

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

1. 字符常量

  • 字符常量是用单引号括起来的一个字符

  • 例如:‘a’,’=’,’+’,’?’都是合法字常量。

在 C 语言中,字常量有以下特点:

1)字常量只能用单引号括起来,不能用双引号或其它括号。

2)字符常量只能是单个字,不能是字符串。

3)字符可以是字集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如‘5’与5是不同的。

2. 字符变量

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

  • 字符变量的类型说明符是 char 。字符变变量类型定义的格式和书写规则都与整型变量相同。

    例如: char a , b ;

3.转义字符

  • 转义字符转字符是一种特殊的字符常量。转义字符以反斜线”\”开头,后跟一个或几 个字符

  • 转义字符具有特定的含,不同于字符原有的意义,故称“转义”字符

    例如, “ \n ”就是一个转字,其意是回车换行”。

转义字主要用来表示哪些用一般字符不便于表示的制代码。常见的转义字符有

\n换行,\t空格,\b退格,\r回车,\反斜杠符,\’单引号,\’’双引号

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

每个字符变量呗分配一个字节的内存空间,因为只能存放一个字符,字符值是以ASCLL码形式存在在变量的内存单元之中。

八、 字符串常量

  • 字符串常量是由一对双引号括起来的字符序列。例如:”CHINA”,“C program”,”$12.5”均为合法字符

  • 字串常量和字符常量是不同的量

    它们之间主要有以下区别:(补充: char 占八位)

  • 字符常量单引号括起来,字符串常量用双引号括起来。

  • 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

  • 可以把一个字符常量赋予一个字符变量,但不能一个字符串常量赋予一个字符变量。例如:char a =‘a’; 而不能char a =“a

  • 字符常量占一个字节空间。字符串常量占的内存字节数等于字串中字节数加1。

    增加\0的一个字节中存放字符 “\o "(ASCI1码为0)。这是字符串结束的标志。

九、 各类数值型数据之间的混合运算

变量的数据类型是可比以转换的。转换的方法有两种,一种是自动转换,一种是强制转换。

1. 自动转换

自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成

自动转换尊循以下规则:

  • 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。

  • 转换按数据长度增0的方向进行,以保证精度不低。如int型和long 型运算时,先把 int 量转成long型后再进行运算。

  • 所有的浮点运算都是以双精度进行的,即使仅含 float 单精度量运管的表达式,也要先转换成 double 型,再作运算。

  • char 型和 short 型参与运算时,先转换成 int 型。

  • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型转换为左边量的类型。如果右边量的数据类型长度长于左边时,会出现精度损失。丢失的部分按四舍五入向前舍入。

#include 
void main() {
float PI = 3.14159; int s, r = 5; s = r*r*PI; printf("s=%d\n", s);}

此时应该将s声明为float类型

2. 强制转换

强制类型转换是通过类型转换运算来实现的。

  • 其一殷形式为:(类型说明符)(表达式)
  • 其功能是表达式的运算结果强制转换成类型说明符所表示的类型。
例如:( float ) a  把 a 转换为实型(int ) (x+y)把 x + y 的结果转换为整型

在使用强制转换时应注意以下问题:

  • 类型说明和表达式都必加括号(单个变量可以不括号),如把( int ) (x+ y) 写成 (int )x+y 则成了把 x 转换成 int 型之后与 y相加了。

  • 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定的类型。

十、 算数运算符和算数表达式

1. 基本的算数运算符

“+”,“-”,“*”,“/”, ”%”

  • 注意”/”的计算结果是舍去小数位的。且如果一个是实型,那么结果为双精度实型。

  • 左结合性:如1+2。用1加上2。

  • 右结合性表示-x,表示为x的左边,加上负号

  • “=”号是右结合性。=号后面的值计算完之后赋值给左边

2. 运算符的优先级

C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理

3. 运算符的结合性:

C 语言中运算符的结合性分为两种、即左结合性和右结合性

算术运算符的结合性是自左至右

  • 如有表达式x-y+2,则y 应先与“-”号结合,执行- y 运,然后再行+2运算。

  • 这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”

最典型的右结合性运算符是赋值运算符

  • x=y=z。由于“=”的右结合性,应先行y=z面行 x =(y=z)运算。
  • C 语言运算中有不少为右结合性,应意区别,以避免理解错误。

4. 自增,自减运算符

  • ++i :i自增1后再参与其他运算
  • --i :i自减1后再参与其他运算
  • i++ :i参与运算后,i的值再自增
  • i-- :i参与运算后,i的值再自减
void main() {
int i = 5, j = 5, p, q; p = (i++) + (i++) + (i++); q = (++j) + (++j) + (++j); printf("%d,%d,%d,%d", p,q,i,j);}

输出结果为:VS2015。据说不同的编译器具有不同的结果。VS2015是计算所有括号里面的再最后统一进行相加

在这里插入图片描述

5.复合的赋值运算符

在赋值符”=”之前加上其他二目运算符课构成符合赋值符。如:+=等

6… 逗号运算符和逗号表达式

在C语言中逗号”,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号运算符。

一般形式为:表达式1,表达式2

转载地址:http://ctxmj.baihongyu.com/

你可能感兴趣的文章
问题整理3
查看>>
zemax仿真二向色镜
查看>>
stm32单片机编程时extern的用法
查看>>
UART4和5的问题
查看>>
Spring框架中在并发访问时的线程安全性
查看>>
网站部署
查看>>
什么情况下会发生栈内存溢出。
查看>>
何为去中心化
查看>>
本地缓存的优缺点
查看>>
缓存一致性:写策略
查看>>
Cache一致性:MESI
查看>>
缓存一致性:写未命中
查看>>
为什么用中间位作为组索引
查看>>
缓存:局部性
查看>>
mysql原理:b+树索引
查看>>
mysql原理:最左原则
查看>>
mysql原理:join标到底是什么,为什么有军规不建议超过三个
查看>>
redis缓存穿透
查看>>
redis缓存雪崩
查看>>
mysql的事务隔离
查看>>