C语言符号优先级

原文地址:C 语言符号优先符 

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

 

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<< 

左移

变量<<表达式

左到右

双目运算符

>> 

右移

变量>>表达式

双目运算符

6

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

 

/=

除后赋值

变量/=表达式

 

*=

乘后赋值

变量*=表达式

 

%=

取模后赋值

变量%=表达式

 

+=

加后赋值

变量+=表达式

 

-=

减后赋值

变量-=表达式

 

<<=

左移后赋值

变量<<=表达式

 

>>=

右移后赋值

变量>>=表达式

 

&=

按位与后赋值

变量&=表达式

 

^=

按位异或后赋值

变量^=表达式

 

|=

按位或后赋值

变量|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

说明:

同一优先级的运算符,运算次序由结合方向所决定。

 

优先级口诀

 

括号成员第一;         括号运算符[]() 成员运算符.  ->

全体单目第二;         所有的单目运算符比如++ -- +(正) -(负) 指针运算*&

乘除余三,加减四;      这个"余"是指取余运算即%

移位五,关系六;       移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;   即== !=

位与异或和位或;       这几个都是位运算: 位与(&)异或(^)位或(|)

"三分天下"八九十; 

逻辑或跟与;           逻辑运算符:|| 和 &&

十二和十一;           注意顺序:优先级(||)  底于 优先级(&&)

条件高于赋值,          三目运算符优先级排到 13 位只比赋值运算符和","高

逗号运算级最低!       逗号运算符优先级最低


#include    <stdio.h>

int main(void)
{
    int test = 1;
    printf("%d,%d\n",!test++,test);
    return 0;
}
输出是0,2;

!test++ 看起来是一个表达式,其实是两个表达式,分别为!test,和test++。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的符号优先级计算器的 C 语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_EXPR_LEN 100 // 最大表达式长度 // 符号栈结构体 struct stack { int top; char data[MAX_EXPR_LEN]; }; // 初始化符号栈 void init_stack(struct stack *s) { s->top = -1; } // 判断符号栈是否为空 int is_empty(struct stack *s) { return s->top == -1; } // 判断字符是否为操作符 int is_operator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/'); } // 判断操作符优先级 int operator_precedence(char op) { if (op == '*' || op == '/') { return 2; } else if (op == '+' || op == '-') { return 1; } else { return 0; } } // 入栈 void push(struct stack *s, char c) { s->data[++s->top] = c; } // 出栈 char pop(struct stack *s) { return s->data[s->top--]; } // 获取栈顶元素 char peek(struct stack *s) { return s->data[s->top]; } // 计算表达式 int evaluate(char *expr) { struct stack operator_stack; // 操作符栈 int num_stack[MAX_EXPR_LEN]; // 数字栈 int num_top = -1; // 数字栈顶指针 int i; init_stack(&operator_stack); for (i = 0; expr[i] != '\0'; i++) { if (isdigit(expr[i])) { // 数字 int num = 0; while (isdigit(expr[i])) { num = num * 10 + (expr[i] - '0'); i++; } i--; num_stack[++num_top] = num; } else if (is_operator(expr[i])) { // 操作符 while (!is_empty(&operator_stack) && operator_precedence(peek(&operator_stack)) >= operator_precedence(expr[i])) { int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = pop(&operator_stack); int result; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } num_stack[++num_top] = result; } push(&operator_stack, expr[i]); } } while (!is_empty(&operator_stack)) { // 处理剩余的操作符 int num2 = num_stack[num_top--]; int num1 = num_stack[num_top--]; char op = pop(&operator_stack); int result; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } num_stack[++num_top] = result; } return num_stack[num_top]; } int main() { char expr[MAX_EXPR_LEN]; printf("请输入一个表达式:"); fgets(expr, MAX_EXPR_LEN, stdin); printf("结果为:%d\n", evaluate(expr)); return 0; } ``` 这个计算器可以处理简单的带符号的数学表达式,包括加、减、乘、除四种运算符。它使用了栈来处理符号优先级,每次扫描到一个操作符时,都将操作符与符号栈顶的操作符进行比较,如果栈顶操作符的优先级不低于当前操作符,则先从数字栈弹出两个操作数,再从符号弹出一个操作符,进行运算,并将结果压入数字栈。如果栈顶操作符的优先级低于当前操作符,则直接将当前操作符压入符号。 最后,当表达式扫描完毕后,还需要处理符号剩余的操作符,按照相同的方式进行计算。最终,数字栈仅剩下一个元素,即为表达式的计算结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值