C 语言运算符优先级

17 Mar 2025 | 5 分钟阅读

C 语言中表达式的运算顺序由运算符优先级决定。它规定了当表达式中存在多个运算符时,哪些运算符先被求值,哪些运算符后被求值。以下是 C 语言运算符按优先级从高到低排序的列表

  • 括号 () - 括号内的表达式最先被求值。
  • 后缀自增/自减 (++/--): 这些运算符在表达式求值后将变量的值增加或减少 1。
  • 前缀自增/自减 (++/--): 这些运算符在表达式求值前将变量的值增加或减少 1。
  • 一元加/减 (+/-): 这些运算符用于指定值的符号。
  • 逻辑非 (!): 逻辑非 (!) 运算符用于使布尔表达式的逻辑含义相反。
  • 位求反 (~): 此运算符用于翻转值的各位。
  • 类型转换: 这些运算符用于将表达式的类型更改为另一种类型。
  • 乘法/除法/取模 (* / %): 这些运算符执行乘法、除法和取模运算。
  • 加法/减法 (+ -): 这些运算符执行加法和减法运算。
  • 位移 (<< >>): 这些运算符用于将数字的位向左或向右移位。
  • 关系运算符 (< <= > >=): 这些运算符对两个数字进行比较并返回布尔结果。
  • 相等运算符 (==!=): 这些运算符比较两个值是否相等,然后根据比较结果返回布尔值。
  • 按位与 (&): 此运算符以位的方式组合两个数字。
  • 按位异或 (): 使用此运算符,对两个数字进行按位异或运算。
  • 按位或 (|): 此运算符以位的方式组合两个数字。
  • 逻辑与 (&&): 逻辑与运算符 (&&) 对两个布尔值应用逻辑与函数。
  • 逻辑或 (||): 使用此运算符,对两个布尔数字进行逻辑组合。三元条件运算符 (?:): 此运算符允许使用条件语句,该语句根据布尔表达式的结果来求值两个表达式之一。
  • 赋值 (= += -= *= /= %= <<= >>= &= ^= |=): 这些运算符用于将值赋给变量,或修改变量的值。

需要注意的是,求值顺序并不总是直观或简单的,通常需要使用括号来明确运算的意图顺序。例如,考虑表达式 "2 + 3 * 4"。没有括号时,不清楚是先执行乘法还是先执行加法。但是,如果我们写 "(2 + 3) * 4",那么就很清楚应该先执行加法,然后再执行乘法。

除了运算符优先级,C 语言还有运算符结合性的规则,这些规则决定了具有相同优先级的运算符的求值顺序。例如,加法和减法运算符具有相同的优先级,但它们是左结合的,这意味着它们从左到右进行求值。因此,表达式 "2 + 3 - 4" 被求值为 "(2 + 3) - 4",结果为 1。

理解 C 语言中的运算符优先级和结合性非常重要,因为它们会影响表达式的结果,并且如果使用不当可能导致意外的结果。通过理解这些规则,您可以编写更高效、更正确的代码。

C 语言中的运算符具有结合性,它定义了具有相同优先级的运算符的求值顺序。有两种结合性:从左到右和从右到左。

以下是 C 语言运算符结合性的表格

Operator precedence in C

请注意,具有从左到右结合性的运算符将从左到右求值,而具有从右到左结合性的运算符将从右到左求值。当表达式中使用多个相同优先级的运算符时,这会影响运算顺序。

为了理解 C 语言中的运算符优先级,请考虑以下示例

C 语言程序

输出

Result: 14
Result2: 77
Result3: 17
Result4: 10
Result5: 1
  1. 在第一个示例中,表达式 x + y * z 被求值为 x + (y * z),这是因为 * 的优先级高于 +。这导致 result 被赋值为 14。
  2. 在第二个示例中,表达式 (a + b) * c 被求值为 (a + b) * c,这是因为括号覆盖了 + 和 * 的优先级。这导致 result2 被赋值为 77。
  3. 在第三个示例中,表达式 e % f 首先被求值,因为 % 的优先级高于 +,然后结果被加到 d 上。这导致 result3 被赋值为 17。
  4. 在第四个示例中,表达式 g * h 首先被求值,因为 * 和 / 的优先级相同且遵循左结合性。然后结果被除以 i。这导致 result4 被赋值为 10。
  5. 在第五个示例中,表达式 j == k 首先被求值,因为 == 和 || 的优先级相同且遵循左结合性。然后结果与 l > k 的结果进行 OR 运算。这导致 result5 被赋值为 1 (true)。

结论

总之,理解 C 语言中的运算符优先级和结合性对于编写正确高效的代码至关重要。它决定了运算符的求值顺序,并可能影响表达式的结果。需要记住的是,括号可以覆盖运算符的默认优先级和结合性。通过结合运算符优先级和结合性表格以及括号,您可以构建复杂的表达式来计算期望的结果。