C语言中应该避免构造复杂的前缀后缀表达式

一个例子:

#include <stdio.h>
 
int main(){
    int i = 0;
    int a[] = {10,20,30};
 
    int r = 1 * a[i++] + 2 * a[i++] + 3 * a[i++];
    printf("%d\n", r);
    return 0;
}

结果是什么呢?


初学者半天想不明白;

半桶水的立刻答道:“哇,简单,1*10+2*20+3*30=140”

高手就考虑了C语言中算术运算符的结合顺序(从右到左),答案是“1*30+2*20+3*10=100”


当你用gcc编译后却惊奇的发现,答案是 60

C语言中,在一个算术运算过程中,i++会保持原值不变。但这是种不好的风格,最好的方法是在写程序过程中避免使用类似上面的复杂的前后缀表达式,尤其是与++运算结合在一起的表达式。


参考:http://blog.jobbole.com/53211/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是将后缀表达式转化成表达式树的 C 语言代码,其使用了栈(Stack)数据结构。 ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> struct node { char data; struct node *left; struct node *right; }; // 栈结构体 struct stack { int top; struct node **items; }; // 创建新节点 struct node *createNode(char data) { struct node *newNode = (struct node *)malloc(sizeof(struct node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 初始化栈 struct stack *createStack(int capacity) { struct stack *newStack = (struct stack *)malloc(sizeof(struct stack)); newStack->top = -1; newStack->items = (struct node **)malloc(capacity * sizeof(struct node *)); return newStack; } // 判断栈是否为空 int isEmpty(struct stack *s) { return s->top == -1; } // 判断栈是否已满 int isFull(struct stack *s) { return s->top == 99; } // 入栈 void push(struct stack *s, struct node *item) { if (isFull(s)) { printf("Stack is full\n"); return; } s->items[++s->top] = item; } // 出栈 struct node *pop(struct stack *s) { if (isEmpty(s)) { printf("Stack is empty\n"); return NULL; } return s->items[s->top--]; } // 从后缀表达式构造表达式树 struct node *constructTree(char postfix[]) { struct stack *s = createStack(strlen(postfix)); struct node *t, *t1, *t2; for (int i = 0; postfix[i] != '\0'; i++) { if (isdigit(postfix[i])) { t = createNode(postfix[i]); push(s, t); } else { t = createNode(postfix[i]); t1 = pop(s); t2 = pop(s); t->right = t1; t->left = t2; push(s, t); } } t = pop(s); free(s); return t; } // 序遍历表达式树 void inorder(struct node *t) { if (t) { inorder(t->left); printf("%c ", t->data); inorder(t->right); } } int main() { char postfix[] = "ab+cd-*"; struct node *root = constructTree(postfix); printf("Infix expression: "); inorder(root); return 0; } ``` 程序定义了 `struct node` 结构体表示表达式树的节点,`struct stack` 结构体表示栈的数据结构。`createNode` 函数用于创建新节点,`createStack` 函数用于初始化栈。 `isEmpty` 和 `isFull` 函数分别用于判断栈是否为空和已满。`push` 函数用于入栈,`pop` 函数用于出栈。 `constructTree` 函数用于将后缀表达式转化成表达式树,程序使用栈来辅助构造表达式树。该函数遍历后缀表达式,如果当前字符是数字,则创建一个新节点并将其入栈。如果当前字符是操作符,则弹出栈顶的两个节点,将当前字符作为新节点的值,将弹出的两个节点分别作为新节点的左右子节点,最后将新节点入栈。 `inorder` 函数用于序遍历表达式树,输出序遍历的结果即为表达式。 在 `main` 函数,定义了一个后缀表达式字符串 `postfix`,通过 `constructTree` 函数将其转换成表达式树,并通过 `inorder` 函数输出表达式
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值