C语言预热之三-数据类型与运算符

现在开始介绍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]