目录
C语言的代码是由英文字符构成的,所有的字符皆来自键盘的输入,所以我们需要了解C语言的字符集的特点和使用规则。
5 C语言字符集
字符是可以区分的最小符号,是构成程序的基础。包括:
- 英文字母:a~z , A~Z;
- 0~9;
- 特殊字符:_ 空格 ! # % 等
由字符可构成进一步的语法成分,如标识符、关键字和特殊运算符等。
5.1 C语言字符集是ASCII字符集的子集
ASCII (美国信息交换标准代码) 表
5.2 C语言的字符集构成C语言的基本元素:标识符、运算符
标识符在程序中用来标识各种程序成分,命名程序中的一些实体:关键字、变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。
标识符的表现形式是字母,数字,下划线,开头必须是英文字母或下划线
示例:
#include <stdio.h>
unsigned char _uc;
int i;
void main(void)
{
_uc = 1;
i = 100;
}
5.3 数据类型的分类
嵌入式C语言编程的目的:操作单片机芯片的内部资源,以满足由这个单片机构成的产品的使用需求。这就要求我们编程的代码里的各种变量、运算、组织逻辑与单片机内部的资源建立起对应的关系,所以程序运行的内存空间应尽可能的节省,运算的步骤尽可能的少等等。
数据类型分类就是为了更好的利用内存,标准化操作和编码方式,表明占据存储空间的多少及构造特点,就是杀鸡就不需要用牛刀。
通过基本数据类型我们就已经可以编程去完成一定的项目任务。
示例://通过单片机点亮一个灯
#include <reg52.h>
unsigned char led ;// 定义一个无符号类型的变量led
void main(void)
{
led = 1;// P1端口的管脚P1.0接了一个灯,置1即可点亮。
P1 = led;
}
说 明 | 字符型 | 短整型 | 整型 | 长整型 | 单精度浮点型 | 双精度浮点型 | 无类型 |
数据类型 | char | short | int | long | float | double | void |
数据长度 | 1 | 2 | 4 | 4 | 4 | 8 | 1 |
5.3.1基本的数据类型(主要特点是值不可以再分解为其他数据类型)
类型说明符 | 数的范围 | 字节数 |
char | -128 ~ 127 | 1 |
unsigned char | 0 ~ 255 | 1 |
int | -32768~32767 即-215~(215-1) | 2 |
unsigned int | 0~65535 即 0~(216-1) | 2 |
short int | -32768~32767 即-215~(215-1) | 2 |
unsigned short int | 0~65535 即 0~(216-1) | 2 |
long int | -2147483648~2147483647 即-231~(231-1) | 4 |
unsigned long | 0~4294967295 即 0~(232-1) | 4 |
ASII表的字符有128个,所以只需要一个char类型的变量就可以全部表示。
6常量与变量
C语言通过定义变量来实现对内存的操作,当我们要使用单片机的某个资源时,需要通过常量或变量来表示,表示方法叫做变量或常量的定义。
6.1 常量
在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。
例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用。
直接常量:
整型常量:12、0、-3、0xFF;
实型常量:4.6、-1.23;
字符常量:’a’、’b’。
符号常量:在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先用预处理命令定义,其一般形式为:
#define 标识符 常量
其中#define 是一条预处理命令(预处理命令都以"#"开头),称为宏定义命令(在后面预处理程序中将进一步介绍),其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。
用标识符代表一个常量,称为符号常量。
符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
使用符号常量的好处是:
含义清楚;
能做到“一改全改”。
习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
【例】
#define BIT_V 2
#define HEX_V 16
#define POW_X BIT_V
void main(void)
{
unsigned char a;
a=pow(POW_X,0)+pow(POW_X,1)+pow(POW_X,2)+pow(POW_X,3)
+pow(POW_X,4)+pow(POW_X,5)+pow(POW_X,6)+pow(POW_X,7);
printf("11111111= %d ",a);
}
6.2 变量
其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。
变量定义必须放在变量使用之前。一般放在函数体的开头部分。
变量定义的一般形式为:
类型关键字 变量名;
short a;
int a;
long a;
float a;
double a;
char a;
struct a;
union a;
enum a;
7 C语言运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
7.1算术运算符
下表显示了 C 语言支持的所有算术运算符。假设变量 a 的值为 10,变量 b 的值为 20,则:
运算符 | 描述 | 实例 |
+ | 把两个操作数相加 | a + b 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | a - b 将得到 -10 |
* | 把两个操作数相乘 | a *b 将得到 200 |
/ | 分子除以分母 | b / a 将得到 2 |
% | 取模运算符,整除后的余数 | b % a 将得到 0 |
++ | 自增运算符,整数值增加 1 | a++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | a-- 将得到 9 |
7.2赋值运算符
下表列出了 C 语言支持的赋值运算符:
运算符 | 描述 | 实例 |
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
8表达式和语句
- 表达式是由一系列运算符(operators)和操作数(operands)组成的。这既是表达式的定义,同时也指明了表达式的组成成分。运算符指明了要进行何种运算和操作,而操作数则是运算符操作的对象。例如
3*4+5
、a=c=d
等,表达式的结果必定是一个值; - 语句的范围更加广泛,不一定是计算,不一定有值,可以是某个操作、某个函数、选择结构、循环等。以分号“;”
3*4+5;
、a=c=d;
等。包括空语句,函数调用语句在内都属于表达式语句。
8.1 C表达式
我们来看一些合法的表达式,如下:
4
-6
4 + 21
a * (b + c/d) / 20
q=5*2
x=++q % 3
q > 3
"hello world"
可以看到一个表达式也可以没有操作符,例如“4”这种形式就是最简单的表达式形式,即最简单的表达式只有一个常量或一个变量名称而没有操作符。
还可以看出,一些表达式是多个较小的表达式的组合,这些小的表达式被称为子表达式(subexpression)。例如表达式c/d是表达式a * (b + c/d) / 20的子表达式,而表达式c和d又是表达式c/d的子表达式。
8.2 C语句
C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
1) 表达式语句
表达式语句由表达式加上分号“;”组成。执行表达式语句就是计算表达式的值。
其一般形式如下:
- x=y+z; /* 赋值语句 */
- y+z; /* 加法运算语句,但计算结果不能保留,无实际意义 */
- i++; /* 自增1语句,i值增1 */
2) 函数调用语句
由函数名、实际参数加上分号“;”组成。其一般形式为:
函数名(实际参数表);
执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值(在后面函数中再详细介绍)。例如:
- printf("Hello world!"); /* 调用库函数,输出字符串 */
3) 控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:
- 条件判断语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
4) 复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句。
在程序中应把复合语句看成是单条语句,而不是多条语句。例如:
- {
- x=y+z;
- a=b+c;
- printf("%d%d", x, a);
- }
是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
5) 空语句
只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。例如:
- ;
- while(1);