目录
- C51 和标准 C 语言的关键字对比详解
- 1. 概述
- 2. C51 和标准 C 语言的关键字对比
- 3. 示例详细解释
- 3.1 C51 特定关键字
- 3.2 标准 C 语言关键字
- `auto`
- `break`
- `case`
- `char`
- `const`
- `continue`
- `default`
- `do`
- `double`
- `else`
- `enum`
- `extern`
- `float`
- `for`
- `goto`
- `if`
- `int`
- `long`
- `register`
- `return`
- `short`
- `signed`
- `sizeof`
- `static`
- `struct`
- `switch`
- `typedef`
- `union`
- `unsigned`
- `void`
- `volatile`
- `while`
- `_Alignas`
- `_Alignof`
- `_Atomic`
- `_Bool`
- `_Complex`
- `_Generic`
- `_Imaginary`
- `_Noreturn`
- `_Static_assert`
- `_Thread_local`
- 4. 总结
- 5. 结束语
- 相关文章:
C51 和标准 C 语言的关键字对比详解
1. 概述
C51 和标准 C 语言在关键字上有显著的差异,主要是因为 C51 是专门为 8051 单片机设计的编程语言,它添加了一些特定的关键字以便更高效地进行硬件控制和内存管理。而标准 C 语言则是通用的编程语言,适用于各种平台。本文将通过表格和详细解释,全面对比 C51 和标准 C 语言的关键字,帮助读者更好地理解两者的区别。
2. C51 和标准 C 语言的关键字对比
以下是 C51 和标准 C 语言的关键字对比表格,包括两者的全部关键字:
2.1 关键字对比表
C51 关键字 | 说明 | 标准 C 语言关键字 | 说明 |
---|---|---|---|
bit | 位变量,占用 1 位内存 | auto | 自动存储类别 |
sfr | 特殊功能寄存器 | break | 跳出循环或 switch 语句 |
sbit | 特殊功能寄存器中的位 | case | switch 语句中的一个分支 |
data | 内部数据存储器 | char | 字符型变量 |
idata | 内部间接数据存储器 | const | 常量 |
pdata | 页间接数据存储器 | continue | 继续下一次循环 |
xdata | 外部数据存储器 | default | switch 语句中的默认分支 |
code | 程序存储器(ROM) | do | do-while 循环 |
bdata | 位寻址区域 | double | 双精度浮点型变量 |
interrupt | 定义中断服务函数 | else | if 语句的另一分支 |
using | 指定寄存器组 | enum | 枚举类型 |
reentrant | 可重入函数 | extern | 声明变量在外部定义 |
- | - | float | 单精度浮点型变量 |
- | - | for | for 循环 |
- | - | goto | 无条件跳转 |
- | - | if | 条件语句 |
- | - | int | 整型变量 |
- | - | long | 长整型变量 |
- | - | register | 寄存器变量 |
- | - | return | 返回语句 |
- | - | short | 短整型变量 |
- | - | signed | 有符号变量 |
- | - | sizeof | 获取变量大小 |
- | - | static | 静态变量 |
- | - | struct | 结构体 |
- | - | switch | 多路分支语句 |
- | - | typedef | 类型定义 |
- | - | union | 联合体 |
- | - | unsigned | 无符号变量 |
- | - | void | 空类型 |
- | - | volatile | 易变变量 |
- | - | while | while 循环 |
- | - | _Alignas | 指定对齐方式 |
- | - | _Alignof | 获取对齐方式 |
- | - | _Atomic | 原子类型 |
- | - | _Bool | 布尔类型 |
- | - | _Complex | 复数类型 |
- | - | _Generic | 泛型选择器 |
- | - | _Imaginary | 虚数类型 |
- | - | _Noreturn | 无返回值类型 |
- | - | _Static_assert | 静态断言 |
- | - | _Thread_local | 线程局部存储 |
2.2 对比表详细解释
2.2.1 C51 特定关键字
bit
:用于定义位变量,占用 1 位内存。sfr
:用于定义特殊功能寄存器,映射硬件寄存器地址。sbit
:用于定义特殊功能寄存器中的位。data
:用于将变量存储在内部数据存储器中。idata
:用于将变量存储在内部间接数据存储器中。pdata
:用于将变量存储在页间接数据存储器中。xdata
:用于将变量存储在外部数据存储器中。code
:用于将常量或只读数据存储在程序存储器(ROM)中。bdata
:用于将变量存储在位寻址区域中。interrupt
:用于定义中断服务函数。using
:用于指定寄存器组,以优化寄存器使用。reentrant
:用于定义可重入函数,允许函数在中断中被调用。
2.2.2 标准 C 语言关键字
auto
:用于定义自动存储类别的变量。break
:用于跳出循环或 switch 语句。case
:用于定义 switch 语句中的一个分支。char
:用于定义字符型变量。const
:用于定义常量。continue
:用于继续下一次循环。default
:用于定义 switch 语句中的默认分支。do
:用于定义 do-while 循环。double
:用于定义双精度浮点型变量。else
:用于定义 if 语句的另一分支。enum
:用于定义枚举类型。extern
:用于声明变量在外部定义。float
:用于定义单精度浮点型变量。for
:用于定义 for 循环。goto
:用于无条件跳转。if
:用于定义条件语句。int
:用于定义整型变量。long
:用于定义长整型变量。register
:用于定义寄存器变量。return
:用于定义返回语句。short
:用于定义短整型变量。signed
:用于定义有符号变量。sizeof
:用于获取变量大小。static
:用于定义静态变量。struct
:用于定义结构体。switch
:用于定义多路分支语句。typedef
:用于定义类型别名。union
:用于定义联合体。unsigned
:用于定义无符号变量。void
:用于定义空类型。volatile
:用于定义易变变量。while
:用于定义 while 循环。_Alignas
:用于指定对齐方式。_Alignof
:用于获取对齐方式。_Atomic
:用于定义原子类型。_Bool
:用于定义布尔类型。_Complex
:用于定义复数类型。_Generic
:用于定义泛型选择器。_Imaginary
:用于定义虚数类型。_Noreturn
:用于定义无返回值类型。_Static_assert
:用于定义静态断言。_Thread_local
:用于定义线程局部存储。
通过以上表格和解释,我们可以看到 C51 和标准 C 语言在关键字上的差异。C51 引入了许多特定的关键字,以便更高效地进行硬件控制和内存管理,而标准 C 语言则更通用,适用于更广泛的平台和应用。
2.3 C51 特定关键字
关键字 | 说明 | 示例 |
---|---|---|
bit | 位变量,占用 1 位内存 | bit myBitVar; |
sfr | 特殊功能寄存器 | sfr P1 = 0x90; |
sbit | 特殊功能寄存器中的位 | sbit P1_0 = P1^0; |
data | 内部数据存储器 | unsigned char data myDataVar; |
idata | 内部间接数据存储器 | unsigned char idata myIDataVar; |
pdata | 页间接数据存储器 | unsigned char pdata myPDataVar; |
xdata | 外部数据存储器 | unsigned char xdata myXDataVar; |
code | 程序存储器(ROM) | const char code myString[] = "Hello, world!"; |
bdata | 位寻址区域 | unsigned char bdata myBDataVar; |
interrupt | 定义中断服务函数 | void timer0_isr(void) interrupt 1 { /* ISR code */ } |
using | 指定寄存器组 | void myFunction(void) using 1 { /* Function code */ } |
reentrant | 可重入函数 | void myReentrantFunc(void) reentrant { /* Code */ } |
2.4 标准 C 语言关键字
关键字 | 说明 | 示例 |
---|---|---|
auto | 自动存储类别 | auto int a; |
break | 跳出循环或 switch 语句 | break; |
case | switch 语句中的一个分支 | case 1: break; |
char | 字符型变量 | char c = 'A'; |
const | 常量 | const int max = 100; |
continue | 继续下一次循环 | continue; |
default | switch 语句中的默认分支 | default: break; |
do | do-while 循环 | do { /* code */ } while (condition); |
double | 双精度浮点型变量 | double d = 3.14; |
else | if 语句的另一分支 | else { /* code */ } |
enum | 枚举类型 | enum colors { RED, GREEN, BLUE }; |
extern | 声明变量在外部定义 | extern int globalVar; |
float | 单精度浮点型变量 | float f = 3.14f; |
for | for 循环 | for (int i = 0; i < 10; i++) { /* code */ } |
goto | 无条件跳转 | goto label; |
if | 条件语句 | if (condition) { /* code */ } |
int | 整型变量 | int n = 42; |
long | 长整型变量 | long l = 1234567890L; |
register | 寄存器变量 | register int fastVar; |
return | 返回语句 | return 0; |
short | 短整型变量 | short s = 32767; |
signed | 有符号变量 | signed int si = -10; |
sizeof | 获取变量大小 | sizeof(int); |
static | 静态变量 | static int count = 0; |
struct | 结构体 | struct Point { int x; int y; }; |
switch | 多路分支语句 | switch (n) { case 1: break; } |
typedef | 类型定义 | typedef unsigned int uint; |
union | 联合体 | union Data { int i; float f; }; |
unsigned | 无符号变量 | unsigned int u = 10; |
void | 空类型 | void func(void); |
volatile | 易变变量 | volatile int v; |
while | while 循环 | while (condition) { /* code */ } |
_Alignas | 指定对齐方式 | _Alignas(16) int a; |
_Alignof | 获取对齐方式 | _Alignof(int); |
_Atomic | 原子类型 | _Atomic int atomicVar; |
_Bool | 布尔类型 | _Bool flag = 1; |
_Complex | 复数类型 | _Complex double z = 1.0 + 2.0i; |
_Generic | 泛型选择器 | _Generic(x, int: "int", float: "float"); |
_Imaginary | 虚数类型 | _Imaginary float y = 1.0i; |
_Noreturn | 无返回值类型 | _Noreturn void exit(int); |
_Static_assert | 静态断言 | _Static_assert(sizeof(int) == 4, "int size"); |
_Thread_local | 线程局部存储 | _Thread_local int tlVar; |
3. 示例详细解释
3.1 C51 特定关键字
bit
用于定义位变量,占用 1 位内存,节省空间。
示例:
bit myBitVar;
sfr
用于定义特殊功能寄存器,映射硬件寄存器地址。
示例:
sfr P1 = 0x90;
sbit
用于定义特殊功能寄存器中的位。
示例:
sbit P1_0 = P1^0;
data
用于将变量存储在内部数据存储器中。
示例:
unsigned char data myDataVar;
idata
用于将变量存储在内部间接数据存储器中。
示例:
unsigned char idata myIDataVar;
pdata
用于将变量存储在页间接数据存储器中。
示例:
unsigned char pdata myPDataVar;
xdata
用于将变量存储在外部数据存储器中。
示例:
unsigned char xdata myXDataVar;
code
用于将常量或只读数据存储在程序存储器(ROM)中。
示例:
const char code myString[] = "Hello, world!";
bdata
用于将变量存储在位寻址区域中。
示例:
unsigned char bdata myBDataVar;
interrupt
用于定义中断服务函数。
示例:
void timer0_isr(void) interrupt 1 {
/* ISR code */
}
using
用于指定寄存器组,以优化寄存器使用。
示例:
void myFunction(void) using 1 {
/* Function code */
}
reentrant
用于定义可重入函数,允许函数在中断中被调用。
示例:
void my
**示例**:
```c
void myReentrantFunc(void) reentrant {
/* Code */
}
3.2 标准 C 语言关键字
auto
用于定义自动存储类别的变量,默认存储类别。
示例:
auto int a;
break
用于跳出循环或 switch 语句。
示例:
break;
case
用于定义 switch 语句中的一个分支。
示例:
case 1:
break;
char
用于定义字符型变量。
示例:
char c = 'A';
const
用于定义常量,变量的值不能被修改。
示例:
const int max = 100;
continue
用于继续下一次循环。
示例:
continue;
default
用于定义 switch 语句中的默认分支。
示例:
default:
break;
do
用于定义 do-while 循环,先执行循环体再判断条件。
示例:
do {
/* code */
} while (condition);
double
用于定义双精度浮点型变量。
示例:
double d = 3.14;
else
用于定义 if 语句的另一分支。
示例:
if (condition) {
/* if code */
} else {
/* else code */
}
enum
用于定义枚举类型。
示例:
enum colors {
RED,
GREEN,
BLUE
};
extern
用于声明变量在外部定义,通常用于跨文件共享变量。
示例:
extern int globalVar;
float
用于定义单精度浮点型变量。
示例:
float f = 3.14f;
for
用于定义 for 循环。
示例:
for (int i = 0; i < 10; i++) {
/* code */
}
goto
用于无条件跳转到标签。
示例:
goto label;
if
用于定义条件语句。
示例:
if (condition) {
/* code */
}
int
用于定义整型变量。
示例:
int n = 42;
long
用于定义长整型变量。
示例:
long l = 1234567890L;
register
用于定义寄存器变量,提示编译器将变量存储在寄存器中以提高访问速度。
示例:
register int fastVar;
return
用于定义返回语句,返回函数的结果。
示例:
return 0;
short
用于定义短整型变量。
示例:
short s = 32767;
signed
用于定义有符号变量。
示例:
signed int si = -10;
sizeof
用于获取变量或数据类型的大小。
示例:
sizeof(int);
static
用于定义静态变量,其作用域仅限于所在的函数或文件,但其值在函数调用结束后仍然存在。
示例:
static int count = 0;
struct
用于定义结构体。
示例:
struct Point {
int x;
int y;
};
switch
用于定义多路分支语句,根据变量的值执行不同的代码块。
示例:
switch (n) {
case 1:
break;
default:
break;
}
typedef
用于定义类型别名。
示例:
typedef unsigned int uint;
union
用于定义联合体,可以在同一内存空间中存储不同类型的数据。
示例:
union Data {
int i;
float f;
};
unsigned
用于定义无符号变量。
示例:
unsigned int u = 10;
void
用于定义空类型,常用于函数返回类型表示不返回值。
示例:
void func(void);
volatile
用于定义易变变量,提示编译器该变量可能会被程序外的因素修改,不应优化。
示例:
volatile int v;
while
用于定义 while 循环,只要条件为真就反复执行循环体。
示例:
while (condition) {
/* code */
}
_Alignas
用于指定对齐方式。
示例:
_Alignas(16) int a;
_Alignof
用于获取对齐方式。
示例:
_Alignof(int);
_Atomic
用于定义原子类型,保证操作的原子性。
示例:
_Atomic int atomicVar;
_Bool
用于定义布尔类型。
示例:
_Bool flag = 1;
_Complex
用于定义复数类型。
示例:
_Complex double z = 1.0 + 2.0i;
_Generic
用于定义泛型选择器,根据表达式的类型选择对应的表达式。
示例:
_Generic(x, int: "int", float: "float");
_Imaginary
用于定义虚数类型。
示例:
_Imaginary float y = 1.0i;
_Noreturn
用于定义无返回值类型的函数,表示该函数不返回到调用者。
示例:
_Noreturn void exit(int);
_Static_assert
用于定义静态断言,在编译时进行条件检查。
示例:
_Static_assert(sizeof(int) == 4, "int size");
_Thread_local
用于定义线程局部存储,变量在每个线程中有独立的副本。
示例:
_Thread_local int tlVar;
4. 总结
通过上述对比和解释,我们可以看出 C51 和标准 C 语言在关键字上的差异。C51 添加了一些特定的关键字,以便更高效地进行硬件控制和内存管理,而标准 C 语言则更通用,适用于更广泛的平台和应用。了解这些差异有助于程序员在不同平台和项目中更好地选择和使用编程语言。
5. 结束语
- 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C51和标准C关键字区别有了更深入的理解和认识。
- 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️