现在开始介绍C语言的数据类型与运算符,这些知识是C语言最基本的内容也是必须掌握的知识之一。
注,本教程视频开讲,详细信息见大英群
2. C语言数据类型与运算符
2.0. C语言基本数据类型简介
在C语言中数据类型分为基本类型、构造类型、指针类型、空类型。其中基本类型可再分为整型、字符型、浮点型;构造类型分为数组、结构体、共用体和枚举[这里可能分类有误]。在本章节中仅介绍基本类型。
2.1. 常量与变量
常量和变量的区别在于常量是一直不变的,而变量是值可以变化的类型。常量分为字面常量和符号常量,字面常量是直接拿来使用的,如整数1,小数2.3,字母a等。符号常量是使用预定义语句实现如:
[codesyntax lang=”c”]
#define PI=3.1415926
[/codesyntax]
这里的#开头的语句为预处理指令,关于预处理的概念将在之后的章节描述。在这个示例中定义了一个符号常量PI,值为3.1415926,之后的所有的PI均表示此值。
变量的定义为变量类型与变量名称如:
[codesyntax lang=”c” lines=”normal”]
int a; float b=3.12; char c='a',e;
[/codesyntax]
在变量类型与变量名称之间至少有一个空格,变量可以在声明的时候赋值。通常情况下变量应该在函数的开始处声明[注:如打算使用Keil的ARM编程请遵守此规则],变量类型将在下章讲述。如需要声明相同类型的变量请用逗号分隔,注意,变量的声明不允许连续赋值如 a=b=c=2;这样写是错误的
2.2.变量类型
a)整型变量
整型变量表示的是整数,又分为以下类型:<注意:int值在不同的编译器中的取值范围不同,在这里就被省略了,在VC中int的信息请参见long>
变量类型 | 说明 | 范围 | 长度 |
---|---|---|---|
short或short int | 有符号整数 | -32768~32767即$$-2^{15}~2^{15}-1$$ | 2字节 |
unsigned short或unsigned short int | 无符号整数 | 0~65535即$$0~2^{16}-1$$ | 2字节 |
long或long int | 有符号整数 | -2147483648~2147483647即$$-2^{31}~2^{31}-1$$ | 4字节 |
unsigned long | 无符号整数 | 0~4294967295即$$0~2^{32}-1$$ | 4字节 |
整数的表示形式:
1)十进制数,没有前缀,由0-9构成
2)八进制数,由前导0开始,没有符号,由0-7构成如0125
3)十六进制数,由0x开始由0-9及A-F构成如:0x3A
<注意:在GCC中可以使用long long 表示更大的数(8字节)在VC中为__int64类型,如果需要计算更大的数值请使用GMP大数计算>
b)浮点变量
浮点变量可以用来表示小数,在内存中小数表示为$$A\times10^n$$,浮点变量的类型可以表示为以下几种
变量类型 | 指数范围(n的范围) | 有效位数(A的有效位数) | 长度 |
---|---|---|---|
float | -127~128 | 6~7 | 4字节 |
double | -1023~1024 | 15-16 | 8字节 |
<注:也有变量类型为long double但是精度未知,在GCC中long double与double相等,如需要更加长的精度的计算请查看mpfr的相关说明>
浮点值可以用两种方式表示一种为小数形式如1.23另一种是使用指数形式如1.234e2表示123.4,e表示10的多少次方。
c)字符型变量
字符型是由单引号括起来的’a’,’?’等都是字符型,字符型在内存中占用一个字节[注意:字符型变量仅表示英语字母]
转义符号(特殊的字符):
转义字符 | 表示内容 |
---|---|
\n | 换行符 |
\t | 制表符 |
\b | 退格 |
\r | 回车 |
\f | 换页 |
\\ | 表示一个反斜杠 |
\’ | 表示单引号 |
\” | 表示双引号 |
\a | 鸣铃 |
字符串,可以表示多个字符用双引号包裹如”hello”字符串的长度需要+1比如hello需要6个字节,最后一位位\0表示字符串的结尾
2.3.变量类型转换
通常,变量会以以下顺序自动转换
char|short ->int ->long->double 自动转换是单向的,在运算的时候发生,float会自动转换为double,但是反向转换时会产生警告级别的错误
强制转换:
可以使用 变量名=(变量类型)变量名进行强制转换,如:
[codesyntax lang=”c”]
float a=2.31; int b= (int)a;
[/codesyntax]
2.4. 运算符
C语言中运算符可以分为算术运算符、逻辑运算符、关系运算符、位运算符、赋值运算符、指针运算符等
2.4.1.算术运算符
名称 | 符号 | 说明 |
---|---|---|
加法运算符 | + | 双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。 |
减法运算符 | – | 双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。 |
乘法运算符 | * | 双目运算符,具有左结合性。 |
除法运算符 | / | 双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。 |
求余运算符(模运算符) | % | 双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double类型。 求余运算的结果等于两数相除后的余数,整除时结果为0。 |
双目运算符+和-具有相同的优先级,它们的优先级比运算符*、/和%的优先级低,而运算符*、/和%的优先级又比单目运算符 +(正号) 和 -(负号) 的优先级低。
自增与自减
自增为++,自减为–,使变量自动加1或减1,放在变量前表示先做自增或自减再加入运算,放在变量后表示在运算之后再自增或自减如:
[codesyntax lang=”c” lines=”normal”]
int i=1,j=4,a,b; a=i++; //此时a为1,i为2 b=--j; //此时b=3,j=3;
[/codesyntax]
2.4.2. 关系运算符
在C语言中有以下关系运算符:
<(小于)
<=(小于或等于) >(大于)
>=(大于或等于)
==(等于)
!=(不等于)
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。关系运算符的返回值为布尔值。
2.4.3. 逻辑运算符
C语言中提供了三种逻辑运算符:
&&(与运算)
||(或运算)
!(非运算)
与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。
“&&”和“||”低于关系运算符,“!”高于算术运算符。
如无法区分运算符的优先级可以使用括号来改变优先级
2.5. 附练习
需要核对答案请直接QQ联系。
1.计算i j p q 的值
[codesyntax lang=”c” lines=”normal”]
int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j);
[/codesyntax]