C语言运算符优先级等级口诀

本文详细介绍了C语言中各类运算符的优先级等级,包括括号、箭头、句号、自增自减、逻辑运算符、算术运算符、移位运算符、比较运算符、位运算符、赋值运算符以及特殊运算符,同时提供了结合律说明,帮助开发者更好地理解和运用C语言。
 C语言运算符优先级等级口诀

C语言运算符优先级等级口诀

       [圆方括号、箭头一句号]
  [自增自减非反负、针强地址长度]
  [乘除,加减,再移位]
  [小等大等、等等不等]
  [八位与],[七位异],[六位或],[五与],[四或],[三疑],[二赋],[一真逗]

  (其中“[]”号为一个等级分段)

说明:

  “圆方括号、箭头一句号”
         指的是第15级的运算符。其中【圆方括号】为“()、[]”,【箭头】指的是指向结构体成员运算符“->”,【句号】指的是结构体成员运算符“.” ;

  “自增自减非反负、针强地址长度”
         指的是第14级的运算符。其中【非】指的是逻辑运算符“!”,【反】指的是按位取反运算符“~”,【负】指的是负号运算符“-”,【针】指的是指针运算符“*”,【强】指的是强制类型转换运算符,【地址】指的是地址运算符“&”,【长度】指的是长度运算符“sizeof ”;

  “乘除,加减,再移位”
         【移位】指的是左移运算符“<<”和右移运算符“>>”,其中【除】还包括了 取余运算符“%”;

  “小等大等、等等不等”
         【小等大等】指的是第10级到第9级的运算符:<、<=、>和>=,【等等】指的是等于运算符“==”,【不等】指的是不等于运算符“!=”;

  “八位与,七位异,六位或”
         【八位与】指的是第8级的 按位与 运算符“&”,【七位异】指的是第7级的按位异或 运算符“^”,【六位或】指的是第6级的按位或运算符“|”;

  “五与,四或”
         【五与】指的是第5级的逻辑与运算符“&&”,【四或】第4级和逻辑或运算符“||”;

  “三疑,二赋,一真逗”
         指的是第3级到第1级的运算符。其中,【三疑】指的是条件运算符“?:” (三有双重含义:即指优先级别是三,它的运算符类型也是三目,疑也取“?”之意),【二赋】指的是赋值运算符=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=和|= ,【一真逗】指的是第1级的“,”运算符,真字只是为了语句需要罢了。

  由于C语言的运算符优先级与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先级的!


=====运算符的优先级与结合律(从高到低排列)=====

运算符   ………………………………………………   结合律

( ) [ ] -> .   …………………………………………   从左至右

! ~ ++ -- (类型) sizeof + - * &   …………    从右至左

* / %   ………………………………………………   从左至右

+ -   …………………………………………………   从左至右

<< >>   ……………………………………………   从左至右

<   <=   > >=   ……………………………………   从左至右

== !=   ……………………………………………     从左至右

&   ……………………………………………………   从左至右

^   ……………………………………………………   从左至右

|   ……………………………………………………   从左至右

&&   …………………………………………………   从左至右

||   ……………………………………………………   从右至左

?:   ……………………………………………………   从右至左

= += -= *= /= %= &= ^= |= <<= >>=   … 从左至右

优先级
运算符 名称或含义 使用形式 结合方向 说明
1
[] 数组下标 数组名[常量表达式] 左到右
() 圆括号 (表达式)/函数名(形参表)
.   成员选择(对象) 对象.成员名
-> 成员选择(指针) 对象指针->成员名
  
2
- 负号运算符 -表达式 右到左 单目运算符
(类型)       强制类型转换     (数据类型)表达式  
++    自增运算符   ++变量名/变量名++ 单目运算符
--    自减运算符   --变量名/变量名-- 单目运算符
*     取值运算符    *指针变量   单目运算符
&    取地址运算符    &变量名    单目运算符
!    逻辑非运算符    !表达式    单目运算符
~    按位取反运算符   ~表达式   单目运算符
sizeof   长度运算符    sizeof(表达式)
  
3
/ 除 表达式/表达式 左到右 双目运算符
* 乘 表达式*表达式 左到右 双目运算符
% 余数(取模) 整型表达式/整型表达式 双目运算符

4
+ 加 表达式+表达式 左到右 双目运算符
- 减 表达式-表达式 双目运算符

5
<< 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式    双目运算符

6
> 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式   双目运算符
< 小于 表达式<表达式       双目运算符
<= 小于等于 表达式<=表达式 双目运算符

7
== 等于 表达式==表达式 左到右 双目运算符

!= 不等于 表达式!= 表达式 双目运算符

8
& 按位与 表达式&表达式 左到右 双目运算符

9
^ 按位异或 表达式^表达式 左到右 双目运算符

10
| 按位或 表达式|表达式 左到右 双目运算符

11
&& 逻辑与 表达式&&表达式 左到右 双目运算符

12
|| 逻辑或 表达式||表达式 左到右 双目运算符

13
?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符

14
= 赋值运算符 变量=表达式 右到左
  
/= 除后赋值 变量/=表达式
  
*= 乘后赋值 变量*=表达式
  
%= 取模后赋值 变量%=表达式
  
+= 加后赋值 变量+=表达式
  
-= 减后赋值 变量-=表达式
  
<<= 左移后赋值 变量<<=表达式
  
>>= 右移后赋值 变量>>=表达式

&= 按位与后赋值 变量&=表达式
  
^= 按位异或后赋值 变量^=表达式
  
|= 按位或后赋值 变量|=表达式
  
15
, 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算

说明:

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

<think> 首先,用户的问题是:“我想了解路由转发规则的优先级顺序 请问路由转发规则的优先级顺序”。用户引用了一些内容,但我需要基于这些引用回答。 关键引用: - 引用[1]:关于BGP路由选择的规则。BGP根据属性比较路由,首选值大者优,其他如路径长度短者优。 - 引用[2]:显示策略路由规则的命令,如 `ip rule` 显示规则列表。 - 引用[3]:关于Nginx的匹配规则前端路由优先级,但提到通过 `try_files` 解决。 - 引用[4]:关于iptables规则编号数据包匹配标准。 用户的问题是路由转发规则的优先级顺序。路由转发规则可能涉及不同层面: - BGP协议层面(引用[1]) - Linux系统策略路由(引用[2]) - Web服务器路由如Nginx(引用[3]) - 防火墙规则如iptables(引用[4]) 用户指定“路由转发规则的优先级顺序”,所以需要综合给出优先级顺序。可能用户想知道在Linux系统中路由选择的顺序。 回顾用户上次问题我的回答:用户说“参考站内引用”,但这不是真正的需求,我应该参考用户上一次的问题我的回答。对话历史开始于系统指令,然后用户第一次问题是这个。所以没有之前的对话。 系统指令要求: - 使用LaTeX格式数学表达式,但这里可能不涉及数学。 - 回答使用中文。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识。 回答结构: - 结构清晰,逐步解决问题。 - 保证真实可靠。 主题:路由转发规则的优先级顺序。 核心优先级: 1. **BGP路由选择优先级**(来自引用[1]): - BGP根据属性顺序比较:首选值(越大越优)、本地优先级(越大越优)、其他如AS路径长度(越短越优)等。 - 顺序严格比较。 2. **Linux策略路由优先级**(来自引用[2]): - 使用 `ip rule` 命令显示规则。 - 规则有优先级顺序,数字越小优先级越高(例:0是最高优先级)。 3. **Nginx路由优先级**(来自引用[3]): - Nginx匹配规则如location块,优先级基于配置顺序匹配类型(精确匹配 > 前缀匹配等)。 4. **iptables规则优先级**(来自引用[4]): - iptables规则有编号,匹配顺序从低编号到高编号(规则编号小优先级高)。 用户问题聚焦于“路由转发规则”,这可能更倾向于网络层路由,如IP路由策略路由。所以,优先处理Linux系统的路由优先级。 在Linux中,路由转发规则涉及路由表策略路由: - **路由表**:系统有多个路由表,如main、default、local等。 - **策略路由**:使用 `ip rule` 定义规则,匹配条件并指定路由表。 - 优先级:`ip rule` 的优先级数字越小,优先级越高。 基于引用[2]:规则编号从0开始,0是最高优先级(如lookup local),然后是1000(lookup rt-static),10101(特定规则)。 在路由转发中,顺序是: 1. 路由策略(基于策略路由规则) 2. 路由表查找(在指定路由表中查找最佳路由) 在Linux中,路由选择顺序: - 当数据包进入时,先匹配策略路由规则(`ip rule`)。 - 匹配的规则指定使用的路由表。 - 在路由表中查找路由,基于最长前缀匹配(最长匹配优先)。 所以,路由转发规则的优先级顺序: 1. **策略路由优先级**:规则优先级数字小者优先(如 `ip rule` 列表中,序号小的规则先匹配)。 2. **路由表查找优先级**:在路由表中,基于目的地址最长前缀匹配原则(掩码长的路由优先)。 此外,引用[1]涉及BGP,但在系统层面,BGP路由被注入到路由表中。 综合回答结构: - 解释优先级顺序。 - 使用引用支持。 - 用中文回答。 - 生成相关问题。 回答大纲: 1. **介绍路由转发规则的优先级顺序**。 2. **详细描述策略路由优先级**(基于引用[2])。 3. **描述路由表查找优先级**(通用原则)。 4. **简要提及其他上下文如BGPNginx**,但聚焦核心。 5. **生成相关问题**。 确保LaTeX:如果涉及数学,如表达优先级数字,但可能不需要数学表达式。 添加引用标识:在引用段落末尾加[^n]。 最终回答: - 标题或清晰分段。 - 结束生成相关问题。 </think> ### 路由转发规则的优先级顺序 路由转发规则的优先级顺序在网络通信中至关重要,它决定了数据包如何被处理转发。不同的系统协议有不同的规则,我将基于您提供的引用内容,重点解释Linux系统中的路由转发优先级(这与引用[2][4]相关),并简要涉及BGP协议(引用[1])Nginx路由(引用[3])。优先级顺序的核心原则是**规则编号小者优先**或**特定属性值优者优先**,具体如下: #### 1. **策略路由规则的优先级(基于Linux系统)** - 在Linux中,策略路由使用`ip rule`命令管理规则,规则按优先级数字从小到大顺序匹配(数字越小优先级越高)。例如: ``` # ip rule list 0: from all lookup local 1000: from all lookup rt-static 10101: from all to 223.5.5.5 lookup rt-eth2.1 ``` - 规则 `0`(最高优先级)最先匹配,所有数据包先查找本地路由表(`local`)。 - 如果未匹配,则检查规则 `1000`(较低优先级),查找静态路由表(`rt-static`)。 - 最后检查规则 `10101`(更低优先级),针对特定目的地址(如 `223.5.5.5`)查找自定义路由表(`rt-eth2.1`)。 - **优先级顺序总结**:规则编号越小越优先匹配,匹配成功后停止后续规则检查[^2]。 #### 2. **路由表查找的优先级** - 一旦策略路由规则指定了路由表(如 `lookup rt-static`),系统在该路由表中基于**最长前缀匹配原则**选择最佳路由: - 目的地址的网络掩码长度越长(即更精确匹配)的路由优先。 - 例如,目的地址 `192.168.1.0/24` 的路由比 `192.168.1.0/16` 优先级更高。 - 如果多条路由有相同掩码长度,则根据路由协议属性(如metric值小者优先)或配置顺序决定(先配置者优先)[^4]。 #### 3. **其他上下文中的优先级规则** - **BGP协议优先级(引用[1])**:BGP选择路由时基于属性顺序比较,数值大者或长度短者优先: - 首选协议值(越大越优)。 - 本地优先级(越大越优)。 - AS路径长度(越短越优),依此类推。如果通过前几个属性能选出最优路由,则停止比较[^1]。 - **Nginx路由优先级(引用[3])**:Nginx的location匹配规则优先级为精确匹配(`=`) > 正则匹配(`~`) > 前缀匹配(`/`),可通过`try_files`指令优化以支持前端路由[^3]。 - **iptables防火墙规则(引用[4])**:iptables规则按编号顺序匹配(编号小者优先),匹配成功后停止。规则编号可通过`iptables -L --line-numbers`显示[^4]。 #### 总体优先级顺序总结(以Linux系统为例) 路由转发规则的全局优先级顺序通常为: 1. **策略路由规则(`ip rule`优先级)**:规则编号小者优先。 2. **路由表查找**:在指定路由表中,基于最长前缀匹配(掩码长度大者优先)。 3. **其他属性比较**:如metric值小者优先或协议特定属性(BGP的本地优先级大者优先)。 这个顺序确保了高效的数据包处理,避免循环或冲突。在实际系统中,规则优先级可以通过配置调整(如修改`ip rule`编号或路由 metric值)来优化网络性能。 ### 相关问题 1. 如何修改Linux策略路由规则的优先级顺序? 2. BGP路由选择中,如果所有属性都相同,最终如何选出最优路由? 3. Nginx的location块匹配优先级如何影响前端路由性能? 4. 在网络故障排查中,如何验证路由转发规则的优先级是否生效?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值