【嵌入式】C51 和标准 C 语言的关键字对比详解

news2024/11/27 18:45:23

LuckiBit

目录

  • C51 和标准 C 语言的关键字对比详解
    • 1. 概述
    • 2. C51 和标准 C 语言的关键字对比
      • 2.1 关键字对比表
      • 2.2 对比表详细解释
        • 2.2.1 C51 特定关键字
        • 2.2.2 标准 C 语言关键字
      • 2.3 C51 特定关键字
      • 2.4 标准 C 语言关键字
    • 3. 示例详细解释
      • 3.1 C51 特定关键字
        • `bit`
        • `sfr`
        • `sbit`
        • `data`
        • `idata`
        • `pdata`
        • `xdata`
        • `code`
        • `bdata`
        • `interrupt`
        • `using`
        • `reentrant`
      • 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特殊功能寄存器中的位caseswitch 语句中的一个分支
data内部数据存储器char字符型变量
idata内部间接数据存储器const常量
pdata页间接数据存储器continue继续下一次循环
xdata外部数据存储器defaultswitch 语句中的默认分支
code程序存储器(ROM)dodo-while 循环
bdata位寻址区域double双精度浮点型变量
interrupt定义中断服务函数elseif 语句的另一分支
using指定寄存器组enum枚举类型
reentrant可重入函数extern声明变量在外部定义
--float单精度浮点型变量
--forfor 循环
--goto无条件跳转
--if条件语句
--int整型变量
--long长整型变量
--register寄存器变量
--return返回语句
--short短整型变量
--signed有符号变量
--sizeof获取变量大小
--static静态变量
--struct结构体
--switch多路分支语句
--typedef类型定义
--union联合体
--unsigned无符号变量
--void空类型
--volatile易变变量
--whilewhile 循环
--_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;
caseswitch 语句中的一个分支case 1: break;
char字符型变量char c = 'A';
const常量const int max = 100;
continue继续下一次循环continue;
defaultswitch 语句中的默认分支default: break;
dodo-while 循环do { /* code */ } while (condition);
double双精度浮点型变量double d = 3.14;
elseif 语句的另一分支else { /* code */ }
enum枚举类型enum colors { RED, GREEN, BLUE };
extern声明变量在外部定义extern int globalVar;
float单精度浮点型变量float f = 3.14f;
forfor 循环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;
whilewhile 循环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. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C51和标准C关键字区别有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

  • 指针的神秘探险:从入门到精通的奇幻之旅 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1956962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JSP的水果销售管理网站

你好&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; JSP技术 工具&#xff1a; 未在文档中明确指出&#xff0c;可能包括但不限于IDEs&#xff08;如Ec…

.NET 相关概念

.NET 和 .NET SDK .NET 介绍 .NET 是一个由 Microsoft 开发和维护的广泛用于构建各种类型应用程序的开发框架。它是一个跨平台、跨语言的开发平台&#xff0c;提供了丰富的类库、API和开发工具&#xff0c;支持开发者使用多种编程语言&#xff08;如C#、VB.NET、F#等&#xf…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术&#xff0c;可以帮助我们在会议记录中省去手动记录&#xff0c;在采访中迅速得到文字稿&#xff0c;在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换&#xff0c;在这里我便给大家介绍几款效率非常高的语音转文字的工具…

Java微服务架构设计:Spring Boot与Spring Cloud实践

1. 引言 1.1 微服务架构概述 微服务架构是一种将单个应用程序划分为一组小型服务的方法&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过轻量级机制&#xff08;通常是HTTP资源API&#xff09;进行通信。这些服务围绕业务能力构建&#xff0c;并且可以由全自动部署…

如何保证分布式服务接口的幂等性

1 问题背景 可能你最先想到的就是使用数据库的事务保证。比如创建订单时&#xff0c;要同时往订单表和订单商品表中插入数据&#xff0c;那这些插入数据的INSERT必须在一个数据库事务中执行&#xff0c;数据库的事务可以确保&#xff1a;执行这些INSERT语句&#xff0c;共赴生死…

DDR核心和事务调度程序(DDRC)

DDR Core and Transaction Scheduler (DDRC)是内存管理系统中一个关键组件&#xff0c;它主要负责管理和调度对DDR&#xff08;Double Data Rate&#xff0c;双倍数据率&#xff09;内存的读写操作。这个组件对于确保系统能够高效地访问内存至关重要&#xff0c;特别是在处理多…

实验15.多线程调度

简介 实验.多线程调度 内核线程 1.在时钟中断函数中处理中&#xff0c;减少当前线程pcb的tick&#xff0c;tick为0则启动调度2.调度&#xff0c;把当前线程pcb放入就绪对立队尾&#xff0c;把就绪线程队首拿出来执行主要代码 引导 省略内核 list.h #ifndef __LIB_KERNEL_…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题&#xff1a; 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能&#xff08;增加上了批量抵扣记账&#xff08;会检查发票号、开票日期有没有填写上&#xff09;、批量撤销入账 两个批量功能…

H616设计时候存在的问题

1.存在大量孤铜的问题&#xff1a; 这种情况是绝对不允许的&#xff0c;但是GBA焊盘打大量的过孔会出现很多这样的孤铜&#xff1a; 解决办法&#xff1a; 像这种出现大量重复焊盘的&#xff0c;用导线连接起来&#xff0c;之后铺铜形成铜皮&#xff0c;再在这个小铜皮上面打…

用frp内网穿透https网站

场景说明 在微信小程序上线测试的时候&#xff0c;自主开发的后端服务在公司局域网&#xff0c;小程序前端在微信公众平台只支持配置https协议的域名来访问服务端。公司一直在使用frp内网穿透工具实现公网访问公司局域网服务&#xff0c;因此&#xff0c;研究如何实现frp代理h…

低代码平台飞书apaas

1. 低代码平台 1.1 概述 低代码是无需编码&#xff08;0 代码&#xff09;或通过少量代码就可以快速生成应用程序的开发平台。 通过可视化进行应用程序开发的方法&#xff0c;具有不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来…

BIM、数字孪生、可视化一结合,我就知道这大屏效果稳稳的啦

在日常的项目中&#xff0c;经常会用到上述三个方面的能力结合&#xff0c;比如智慧工地、智慧楼宇、智慧园区等项目&#xff0c;本文就分享一批这方面的精彩作品。 BIM&#xff08;建筑信息模型&#xff09;、数字孪生和可视化大屏可以结合起来&#xff0c;为建筑行业和工程管…

C语言中的二维数组

文章目录 &#x1f34a;自我介绍&#x1f34a;二维数组&#x1f34a;代码实战 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要变强&…

AI 绘画是否符合当代主流审美?

在当今时代&#xff0c;AI 绘画成为了一个备受关注的热门话题。那么&#xff0c;AI 绘画是否符合当代主流审美呢&#xff1f; AI 绘画有着诸多符合当代审美的特质。它能展现出独特的视觉效果&#xff0c;风格丰富多样&#xff0c;如后现代风格、奇幻风格等等&#xff0c;足以满…

前端必备基础【网络通信】(2024最新版)

Ajax Asynchronous Javascript and XML 的缩写&#xff0c;是使用 JS 发起网络通信的技术统称&#xff0c;具体步骤为&#xff1a; 创建 XMLHttpRequest 实例发出 HTTP 请求接收服务器传回的数据更新网页数据&#xff08;通常是部分内容&#xff0c;而不是整个网页&#xff09…

B端:导航条就框架提供的默认样式吗?非也,看过来。

导航条不一定必须使用框架提供的默认样式&#xff0c;你可以根据项目需求和设计风格进行自定义。通过使用框架提供的自定义选项、CSS样式覆盖、自行设计或者使用其他UI库或组件&#xff0c;你可以实现独特且符合需求的导航条样式。 下面发一些参考给友友们&#xff0c;可以让设…

请你谈谈:vue的渲染机制(render)- 2举例说明问题

如何在 Vue 的 render 函数中使用 createElement 方法来创建虚拟节点&#xff08;VNode&#xff09;。这里是一个稍微整理后的示例&#xff0c;它直接对应于你提供的注释和代码片段&#xff0c;但作为一个完整的 render 函数的一部分&#xff0c;可能位于一个 Vue 组件的 scrip…

关于ITSS认证-IT服务工程师、IT服务项目经理常见问题解答!

TSS&#xff0c;即信息技术服务标准&#xff08;Information Technology Service Standards&#xff0c;简称ITSS&#xff09;&#xff0c;是一套系统化的信息技术服务规范。 它全面规定了信息技术服务产品及其组成要素&#xff0c;旨在指导标准化的信息技术服务实施&#xff…

企业微信开发智能升级:AIGC技术赋能,打造高效沟通平台

文章目录 一、AIGC在企业微信开发中的核心价值1. 智能化客服体验2. 自动化工作流程3. 个性化内容推荐4. 深度数据分析与洞察 二、使用AIGC进行企业微信开发的实践路径1. 需求分析与场景定义2. 技术选型与平台搭建3. 模型训练与调优4. 接口对接与功能集成5. 测试与优化 《企业微…

css各种使用案例合集(一)

1、文字不换行 场景1&#xff1a;使 div 标签的文字内容不换行 代码示例&#xff1a; <div class"nowrap-div">这是一段很长的文字&#xff0c;我们不会让它换行。</div> .nowrap-div { white-space: nowrap; } 2、步骤条 场景2&#xff1a;特殊样式的…