阡陌 发表于 2024-1-7 01:29:43

C 语言运算符优先级


C 语言中运算符的优先级分为 15 级,从高到低依次为:

<table><tbody><tr><td>优先级 </td><td>运算符 </td><td>名称或含义 </td><td>使用形式 </td><td>结合方向 </td><td>说明 </td></tr><tr><td rowspan="4">1 </td><td>[] </td><td>数组下标 </td><td>数组名[常量表达式] </td><td rowspan="4">左到右 </td><td></td></tr><tr><td>() </td><td>圆括号 </td><td>(表达式) / 函数名(形参表) </td><td></td></tr><tr><td>. </td><td>成员选择(对象) </td><td>对象.成员名 </td><td></td></tr><tr><td>-&gt; </td><td>成员选择(指针) </td><td>对象指针-&gt;成员名 </td><td></td></tr><tr><td rowspan="9">2 </td><td>- </td><td>负号运算符 </td><td>-表达式 </td><td rowspan="9">右到左 </td><td rowspan="7">单目运算符 </td></tr><tr><td>~ </td><td>按位取反运算符 </td><td>~表达式 </td></tr><tr><td>++ </td><td>自增运算符 </td><td>++变量名 / 变量名++ </td></tr><tr><td>-- </td><td>自减运算符 </td><td>--变量名 / 变量名-- </td></tr><tr><td>* </td><td>取值运算符 </td><td>*指针变量 </td></tr><tr><td>&amp; </td><td>取地址运算符 </td><td>&amp;变量名 </td></tr><tr><td>! </td><td>逻辑非运算符 </td><td>!表达式 </td></tr><tr><td>(类型) </td><td>强制类型转换 </td><td>(数据类型)表达式 </td><td></td></tr><tr><td>sizeof </td><td>长度运算符 </td><td>sizeof(表达式) </td><td></td></tr><tr><td rowspan="3">3 </td><td>/ </td><td>除 </td><td>表达式/表达式 </td><td rowspan="3">左到右 </td><td rowspan="3">双目运算符 </td></tr><tr><td>* </td><td>乘 </td><td>表达式*表达式 </td></tr><tr><td>% </td><td>余数(取模) </td><td>整型表达式%整型表达式 </td></tr><tr><td rowspan="2">4 </td><td>+ </td><td>加 </td><td>表达式+表达式 </td><td rowspan="2">左到右 </td><td rowspan="2">双目运算符 </td></tr><tr><td>- </td><td>减 </td><td>表达式-表达式 </td></tr><tr><td rowspan="2">5 </td><td>&lt;&lt;&nbsp; </td><td>左移 </td><td>变量&lt;&lt;表达式 </td><td rowspan="2">左到右 </td><td rowspan="2">双目运算符 </td></tr><tr><td>&gt;&gt;&nbsp; </td><td>右移 </td><td>变量&gt;&gt;表达式 </td></tr><tr><td rowspan="4">6 </td><td>&gt;&nbsp; </td><td>大于 </td><td>表达式&gt;表达式 </td><td rowspan="4">左到右 </td><td rowspan="4">双目运算符 </td></tr><tr><td>&gt;=</td><td>大于等于 </td><td>表达式&gt;=表达式 </td></tr><tr><td>&lt;&nbsp; </td><td>小于 </td><td>表达式&lt;表达式 </td></tr><tr><td>&lt;=</td><td>小于等于 </td><td>表达式&lt;=表达式 </td></tr><tr><td rowspan="2">7 </td><td>==</td><td>等于 </td><td>表达式==表达式 </td><td rowspan="2">左到右 </td><td rowspan="2">双目运算符 </td></tr><tr><td>!=</td><td>不等于 </td><td>表达式!=表达式 </td></tr><tr><td>8 </td><td>&amp; </td><td>按位与 </td><td>表达式&amp;表达式 </td><td>左到右 </td><td>双目运算符 </td></tr><tr><td>9 </td><td>^ </td><td>按位异或 </td><td>表达式^表达式 </td><td>左到右 </td><td>双目运算符 </td></tr><tr><td>10 </td><td>| </td><td>按位或 </td><td>表达式|表达式 </td><td>左到右 </td><td>双目运算符 </td></tr><tr><td>11 </td><td>&amp;&amp; </td><td>逻辑与 </td><td>表达式&amp;&amp;表达式 </td><td>左到右 </td><td>双目运算符 </td></tr><tr><td>12 </td><td>|| </td><td>逻辑或 </td><td>表达式||表达式 </td><td>左到右 </td><td>双目运算符 </td></tr><tr><td>13 </td><td>?: </td><td>条件运算符 </td><td>表达式1? 表达式2: 表达式3 </td><td>右到左 </td><td>三目运算符 </td></tr><tr><td rowspan="11">14 </td><td>=</td><td>赋值运算符 </td><td>变量=表达式 </td><td rowspan="11">右到左 </td><td></td></tr><tr><td>/=</td><td>除后赋值 </td><td>变量/=表达式 </td><td></td></tr><tr><td>*=</td><td>乘后赋值 </td><td>变量*=表达式 </td><td></td></tr><tr><td>%=</td><td>取模后赋值 </td><td>变量%=表达式 </td><td></td></tr><tr><td>+=</td><td>加后赋值 </td><td>变量+=表达式 </td><td></td></tr><tr><td>-=</td><td>减后赋值 </td><td>变量-=表达式 </td><td></td></tr><tr><td>&lt;&lt;=</td><td>左移后赋值 </td><td>变量&lt;&lt;=表达式 </td><td></td></tr><tr><td>&gt;&gt;=</td><td>右移后赋值 </td><td>变量&gt;&gt;=表达式 </td><td></td></tr><tr><td>&amp;=</td><td>按位与后赋值 </td><td>变量&amp;=表达式 </td><td></td></tr><tr><td>^=</td><td>按位异或后赋值 </td><td>变量^=表达式 </td><td></td></tr><tr><td>|=</td><td>按位或后赋值 </td><td>变量|=表达式 </td><td></td></tr><tr><td>15 </td><td>, </td><td>逗号运算符 </td><td>表达式,表达式,… </td><td>左到右 </td><td></td></tr></tbody></table>

在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。

C 语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 `x-y+z`,则y应先与 `-` 号结合,执行 `x-y` 运算,然后再执行 `+z` 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。如 `x=y=z`,由于 `=` 的右结合性,应先执行 `y=z`,再执行 `x=(y=z)` 运算。所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其他的都是从左至右结合。


页: [1]
查看完整版本: C 语言运算符优先级