C语言优先级是怎么样的?

1. 最高优先级(从高到低)

1.1 圆括号 ( )

说明:括号内的表达式总是最先计算,无论括号嵌套多少层。

1.2 一元运算符
  • sizeof:返回数据类型的大小。
  • ++--:前置递增/递减运算符,改变变量自身的值后再进行表达式计算。
  • -(负号):一元负运算符,对数值进行相反数运算。
  • +(正号):一元正运算符,一般用在数值前无实际效果,主要用于消除歧义。
  • !:逻辑非运算符,将布尔值取反。
  • ~:按位取反运算符,对整数的二进制位进行逐位取反。
  • &(地址运算符):取变量的内存地址。
  • *(间接寻址运算符):通过指针访问其指向的对象。
1.3 结构成员运算符 . ->
  • .:用于结构体或联合体成员访问,如 struct_name.member_name
  • ->:用于指针访问结构体或联合体成员,如 pointer_to_struct->member_name

2. 第二优先级

2.1 乘法、除法和求余运算符
  • *(乘法)
  • /(除法)
  • %(模运算,即求余数)

3. 第三优先级

3.1 加法和减法运算符
  • +(加法)
  • -(减法)

4. 第四优先级

4.1 按位左移和右移运算符
  • <<(左移)
  • >>(右移)

5. 第五优先级

5.1 关系运算符
  • <(小于)
  • >(大于)
  • <=(小于等于)
  • >=(大于等于)
  • ==(等于)
  • !=(不等于)

6. 第六优先级

6.1 等价运算符
  • ==(等于)
  • !=(不等于)

7. 第七优先级

7.1 逻辑与运算符 &&

逻辑与运算符两边的表达式都为真时整个表达式才为真。

8. 第八优先级

8.1 逻辑或运算符 ||

逻辑或运算符两边只要有任意一边的表达式为真,则整个表达式为真。

9. 第九优先级

9.1 条件运算符(三元运算符)? :
condition ? expr1 : expr2

如果 condition 为真,则计算并返回 expr1 的值,否则返回 expr2 的值。

10. 第十优先级

10.1 赋值运算符
  • =(简单赋值)
  • +=, -=(加法赋值和减法赋值)
  • *=, /=, %=(乘法、除法和模运算赋值)
  • <<=, >>=(左移和右移赋值)
  • &=, ^=, |=(按位与、异或、或运算赋值)

结合性

当多个相同优先级的运算符出现在同一个表达式中时,它们按照从左到右从右到左的顺序结合。例如,乘法和除法运算符具有相同的优先级,它们都是从左到右结合的,即a * b / c会先计算a * b,再除以c

同样地,逻辑与运算符&&也是从左到右结合,而赋值运算符则是从右到左结合,意味着a = b = c会首先计算b = c,然后将结果赋给a

为了方便记忆,可以参考以下简化的优先级口诀:

先括号,再一元,
乘除移位比大小,
逻辑与随后跟,
逻辑或放中间,
最后是条件赋值。

实际编写代码时为了代码清晰易懂,强烈建议在必要时使用括号明确表明意图,避免依赖默认的优先级规则。此外,不同的运算符之间可以通过添加括号来强制改变运算顺序。

你可能感兴趣的:(随笔,c语言,开发语言)