运算符的优先级

    首先要清楚都有哪几种运算符?
    算数运算符(单目运算符,双目运算符),移位运算符,关系运算符,逻辑运算符,三目运算符,赋值运算符,逗号运算符还有(),[],->,.(我在这里!).
    所有的运算符中:(),[],->,.    这四个运算符的优先级最高。
    其次是单目运算符,再次双目运算符,注意单目运算符的运算顺序是自右向左的。
    之后是移位运算符,<< >>
    第四是关系运算符,关系运算符中的< > <= >=四个运算符的优先级大于 == 和 != ,这样方便与我们写如下的代码:if( a<b == c<d) //a与b的大小顺序与c与d的大小顺序相同。
    逻辑运算符的优先级顺序是基于B语言等历史原因,我也不是特别了解,在此不作详述,其中只要记住 与 大于 或,异或在二者之间,注意不要忘了异或 ^ 这个运算符。
    三目运算符的优先级大于赋值运算符,这样我们就可以下如下的代码:tax_rate = income > 40000 && residency < 5 ? 3.5 : 2.0(想不出比这个更好的例子,索性就用人家的吧)。注意赋值运算符的运算顺序是自右向左的,但是不能理解“三目运算符的运算顺序是自右向左”是个什么情形?“?:?:”这样?有什么用处呢?
    逗号运算符的优先级最低,注意函数参数中的逗号不是运算符,eg.method(x,y)中x,y的求值顺序是未定义的,而method2((x,y))中的x,y的求值顺序是是确定的先x后y。
    这是从网上找来的C运算符优先级表:http://www.slyar.com/blog/c-operator-priority.html,这个东西在很多书上能找到,但是如果你想直接被它,太难了!

转载于:https://www.cnblogs.com/kimimaro/archive/2011/04/07/2007842.html

<think>好的,用户现在问的是C语言中的运算符优先级。之前他们问过数据类型的大小,现在转向了运算符优先级,可能是在学习基础语法,或者在编程时遇到了优先级相关的问题,导致程序运行结果不符合预期。 首先,我需要回忆C语言中运算符优先级规则。可能用户需要的是一个清晰的列表,从最到最低优先级排列,同时每个类别给出例子。另外,用户可能不太清楚为什么某些运算符优先级是这样的,或者常见的错误点在哪里,比如逻辑运算符比较运算符优先级,或者赋值运算符优先级最低这些情况。 接下来,要确保覆盖所有主要的运算符类别,包括括号、单目运算符、算术运算符、移位、关系运算符、相等性、位运算符、逻辑运算符、三元条件、赋值逗号等。可能需要特别指出容易混淆的地方,比如加减移位的优先级,或者逻辑、或的优先级差异。 还要考虑用户可能的实际应用场景,比如在复杂的表达式中如何正确使用括号来避免歧义,或者常见的错误案例,比如将if (a & 1 == 0) 误解为检查a的最低位是否为0,但实际上由于==优先级于位,会导致错误的结果。这时候需要提醒用户注意运算符优先级带来的陷阱。 另外,用户可能对结合性不太了解,需要解释同一优先级运算符如何结合,比如左结合或右结合,比如赋值运算符是右结合的,所以a = b = c会被处理为a = (b = c)。 还要考虑用户是否需要示例代码来验证或理解优先级,比如使用printf来展示不同运算符的求值顺序,或者通过注释说明表达式如何被解析。 最后,可能需要给出一些实用建议,比如在不确定时使用括号,或者参考标准文档,以及如何查找优先级表格来辅助编程。同时,可能推荐用户使用编译器警告或静态分析工具来捕捉可能的优先级错误。 总结下来,回答需要结构清晰,分点列出优先级,强调常见误区注意事项,提供示例帮助理解,并给出实用建议,确保用户能够正确应用运算符优先级规则,避免常见的错误。</think>在C语言中,运算符优先级决定了表达式中运算符的执行顺序。以下是主要运算符优先级到低排列(**同类运算符优先级分组**),并附示例注意事项: --- ### **1. 最优先级:括号成员访问** - **`()`**(函数调用、强制类型转换) - 示例:`(a + b) * c`(先计算括号内) - **`[]`**(数组下标)、**`.`**(结构体成员)、**`->`**(指针成员访问) - 示例:`arr[5]`、`obj.value`、`ptr->data` --- ### **2. 单目运算符** - **`++`(后置自增)**、**`--`(后置自减)** - 示例:`a++`(先使用`a`再自增) - **`++`(前置自增)**、**`--`(前置自减)**、**`!`(逻辑非)**、**`~`(按位取反)**、**`+`(正号)**、**`-`(负号)** - 示例:`!flag`、`-num`、`++i` --- ### **3. 算术运算符** - **`*`(乘)**、**`/`(除)**、**`%`(取模)** - 示例:`a * b + c`(先乘后加) - **`+`(加)**、**`-`(减)** - 示例:`x + y * z`(先乘后加) --- ### **4. 移位运算符** - **`<<`(左移)**、**`>>`(右移)** - 示例:`a << 2 + 1` 等效于 `a << (2 + 1)`(注意优先级低于加减!) --- ### **5. 关系运算符** - **`<`**、**`<=`**、**`>`**、**`>=`** - 示例:`a < b + 1` 等效于 `a < (b + 1)` --- ### **6. 相等性判断** - **`==`(等于)**、**`!=`(不等于)** - 示例:`a == b && c > d`(先比较`a``b`,再判断逻辑) --- ### **7. 位运算符** - **`&`(按位)** → **`^`(按位异或)** → **`|`(按位或)** - 示例:`a & b | c` 等效于 `(a & b) | c` --- ### **8. 逻辑运算符** - **`&&`(逻辑)** → **`||`(逻辑或)** - 示例:`x > 0 && x < 10`(先判断两个不等式,再执行逻辑) --- ### **9. 条件运算符** - **`?:`(三元条件)** - 示例:`a > b ? a : b`(先判断条件,再返回结果) --- ### **10. 赋值运算符** - **`=`**、**`+=`**、**`-=`**等复合赋值符 - 示例:`a = b = 5`(右结合性,等效于`a = (b = 5)`) --- ### **11. 最低优先级逗号运算符** - **`,`** - 示例:`a = (b=3, b+2)`(先执行`b=3`,再返回`5`) --- ### **常见误区注意事项** 1. **优先级陷阱**: - `if (a & 1 == 0)` ❌ 等效于 `a & (1 == 0)`(本意应为 `(a & 1) == 0`) - `*ptr++` ❌ 等效于 `*(ptr++)`(本意可能为`(*ptr)++`) 2. **结合性规则**: - 同一优先级运算符按**结合方向**执行: - 左结合:`a + b - c` → `(a + b) - c` - 右结合:`a = b = c` → `a = (b = c)` 3. **实用建议**: - 不确定时**显式使用括号**,避免歧义 - 参考C标准文档或编译器手册验证优先级 - 使用代码验证: ```c int a = 5, b = 3, c = 2; printf("%d\n", a + b * c); // 输出11(先乘后加) ``` --- ### **运算符优先级速查表** | 优先级 | 运算符 | 结合性 | |--------|-----------------------------------|----------| | 最 | `()` `[]` `.` `->` `++`(后置) `--`(后置) | 左到右 | | ↓ | `++`(前置) `--`(前置) `!` `~` `+`(正) `-`(负) | 右到左 | | ↓ | `*` `/` `%` | 左到右 | | ↓ | `+` `-` | 左到右 | | ↓ | `<<` `>>` | 左到右 | | ↓ | `<` `<=` `>` `>=` | 左到右 | | ↓ | `==` `!=` | 左到右 | | ↓ | `&` → `^` → `|` | 左到右 | | ↓ | `&&` → `||` | 左到右 | | ↓ | `?:` | 右到左 | | ↓ | `=` `+=` `-=` 等赋值运算符 | 右到左 | | 最低 | `,` | 左到右 | 掌握优先级可避免代码逻辑错误,建议结合实践加深理解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值