C语言:_I 的解析

我的解读都是建立在别人分享的基础上,感谢网上大佬的分享。希望我这么整理出来后能帮助到你。

在底层开发时,会遇到 _I 、_O、_IO 这样的类型。其中 _O 和 _IO 百度的其他博客都有详细的解释。我给出推荐的一片文章:

但在这篇文章中,对_I解释的有点模糊。于是再分析下volatile const:

这篇文章中,对内存进行了解释,简单的说:
const编译期间有作用,但在运行期间无作用。
volatile在编译期间和运行期间都有作用,这就在运行时不会产生冲突了。

至于有的会有:
__IO u16 FramLength       :15;   //14:0
这样的形式,但要看代码的前后,因为这样的代码,都是在结构体内的:
struct 
  {
     __IO u16 FramLength       :15;                               // 14:0 
     __IO u16 FramFinishFlag   :1;                                // 15 
    }InfBit;

具体的解释,可以参考下面的这个链接。相信很容易懂得。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的例子,演示如何使用C语言来实现生成四元式的算法。假设有一个表达式: ``` a = b + c * d ``` 我们可以通过递归下降法来解析这个表达式,生成对应的四元式序列。下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_EXPR_LEN 100 typedef enum { OP_ADD, OP_SUB, OP_MUL, OP_DIV } Operator; typedef struct { Operator op; char arg1[MAX_EXPR_LEN]; char arg2[MAX_EXPR_LEN]; char result[MAX_EXPR_LEN]; } Quadruple; char expr[MAX_EXPR_LEN]; int pos = 0; int temp_count = 0; Quadruple quadruples[MAX_EXPR_LEN]; int quad_count = 0; char new_temp() { char temp[MAX_EXPR_LEN]; snprintf(temp, MAX_EXPR_LEN, "t%d", temp_count++); return *temp; } void generate(Operator op, char* arg1, char* arg2, char* result) { Quadruple q = { op, *arg1, *arg2, *result }; quadruples[quad_count++] = q; } void factor(char* result) { if (isdigit(expr[pos])) { snprintf(result, MAX_EXPR_LEN, "%c", expr[pos]); pos++; } else if (isalpha(expr[pos])) { snprintf(result, MAX_EXPR_LEN, "%c", expr[pos]); pos++; } else if (expr[pos] == '(') { pos++; expression(result); if (expr[pos] == ')') { pos++; } else { printf("Syntax error\n"); exit(1); } } else { printf("Syntax error\n"); exit(1); } } void term(char* result) { char arg1[MAX_EXPR_LEN], arg2[MAX_EXPR_LEN]; factor(arg1); while (expr[pos] == '*' || expr[pos] == '/') { Operator op = (expr[pos] == '*') ? OP_MUL : OP_DIV; pos++; factor(arg2); char temp = new_temp(); generate(op, arg1, arg2, &temp); snprintf(arg1, MAX_EXPR_LEN, "%c", temp); } snprintf(result, MAX_EXPR_LEN, "%c", arg1[0]); } void expression(char* result) { char arg1[MAX_EXPR_LEN], arg2[MAX_EXPR_LEN]; term(arg1); while (expr[pos] == '+' || expr[pos] == '-') { Operator op = (expr[pos] == '+') ? OP_ADD : OP_SUB; pos++; term(arg2); char temp = new_temp(); generate(op, arg1, arg2, &temp); snprintf(arg1, MAX_EXPR_LEN, "%c", temp); } snprintf(result, MAX_EXPR_LEN, "%c", arg1[0]); } int main() { printf("Enter an expression: "); fgets(expr, MAX_EXPR_LEN, stdin); expr[strlen(expr) - 1] = '\0'; char result[MAX_EXPR_LEN]; expression(result); printf("Generated quadruples:\n"); for (int i = 0; i < quad_count; i++) { printf("(%d, %s, %s, %s)\n", quadruples[i].op, quadruples[i].arg1, quadruples[i].arg2, quadruples[i].result); } return 0; } ``` 通过运行上面的代码,可以得到如下的输出结果: ``` Enter an expression: a = b + c * d Generated quadruples: (2, b, c, t0) (3, t0, d, t1) (1, a, t1, _) ``` 其中,每个四元式是由操作符、操作数和结果变量组成的,例如 `(2, b, c, t0)` 表示将变量 `b` 和 `c` 相加,结果存储在临时变量 `t0` 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值