文章目录
?前言?运算符优先级简述 ?逻辑与和逻辑或?赋值和逗号运算符 ?位运算?条件表达式?位运算与算术运算结合?混合使用条件表达式和赋值运算符? 逗号运算符的使用? 复杂条件表达式 ?运算符优先级的重要性?总结
?前言
在C语言中,运算符的优先级决定了表达式中各个运算符的计算顺序。了解这些优先级对于正确理解和编写复杂表达式至关重要。本文将深入探讨C语言中各种运算符的优先级及其影响。
?运算符优先级简述
C语言中的运算符根据其优先级可以分为多个级别。在表达式中,具有较高优先级的运算符会在具有较低优先级的运算符之前执行。下表列出了C语言中常见的运算符,并按照优先级从高到低的顺序排列:
优先级 | 运算符 | 描述 |
---|---|---|
1 | () [] -> . | 函数调用、数组下标、结构体成员访问 |
2 | ! ~ ++ – + - | 逻辑非、按位取反、自增、自减、正负号 |
3 | * / % | 乘法、除法、取模 |
4 | + - | 加法、减法 |
5 | << >> | 左移、右移 |
6 | < <= > >= | 关系运算符 |
7 | == != | 等于、不等于 |
8 | & | 按位与 |
9 | ^ | 按位异或 |
10 | | | 按位或 |
11 | && | 逻辑与 |
12 | || | 逻辑或 |
13 | ?: | 条件表达式 |
14 | = += -= *= /= %= &= ^= |= <<= >>= | 赋值及复合赋值 |
15 | , | 逗号运算符 |
?逻辑与和逻辑或
#include <stdio.h>int main() { int a = 5, b = 10, c = 15; int result; result = (a > b) && (b < c); // 0 printf("(a > b) && (b < c) = %d\n", result); result = (a > b) || (b < c); // 1 printf("(a > b) || (b < c) = %d\n", result); return 0;}
在第一个表达式中,(a > b)为假,因此不会继续执行后面的 (b < c),直接返回结果为0。在第二个表达式中,(a > b)为假,但由于逻辑或运算符的存在,依然继续执行 (b < c),因此返回结果为1。
?赋值和逗号运算符
#include <stdio.h>int main() { int a = 5, b = 10, c = 15; int result; result = (a = b, b = c, c); // 15 printf("Result = %d\n", result); return 0;}
该表达式先执行 a = b,然后执行 b = c,最后返回 c 的值。因此结果为15。
?位运算
#include <stdio.h>int main() { int a = 5, b = 10, c = 15; int result; result = a | b & c; // 15 printf("Result = %d\n", result); return 0;}
位与运算符(&)的优先级高于位或运算符(|),所以 b & c 先被计算,然后将结果与 a 进行位或运算,得到最终结果15。
?条件表达式
#include <stdio.h>int main() { int a = 5, b = 10; int result; result = (a > b) ? a : b; // 10 printf("Result = %d\n", result); return 0;}
条件表达式 (a > b) ? a : b 先判断 (a > b) 是否为真,如果为真则返回 a,否则返回 b。因为在这个示例中 (a > b) 为假,所以返回结果为10。
?位运算与算术运算结合
#include <stdio.h>int main() { int a = 5, b = 10, c = 3; int result; result = a + b << c; // 320 printf("Result = %d\n", result); return 0;}
在这个示例中,+ 的优先级高于 <<,所以先进行加法运算,然后再进行位左移运算。因此结果为 (a + b) << c = (5 + 10) << 3 = 15 << 3 = 120。
?混合使用条件表达式和赋值运算符
#include <stdio.h>int main() { int a = 5, b = 10; int result; result = (a > b) ? (a *= 2) : (b /= 2); // b = 5 / 2 = 2 printf("Result = %d\n", result); return 0;}
条件表达式中,如果 (a > b) 为假,则执行 (b /= 2),即 b 的值除以2,因此 b 最终为5。同时,条件表达式的值就是所执行的分支的值,因此 result 的值也是5。
? 逗号运算符的使用
#include <stdio.h>int main() { int a = 5, b = 10, c = 15; int result; result = (a = b + 2, b = c - 3, c * 2); // 30 printf("Result = %d\n", result); return 0;}
逗号运算符的优先级是最低的,因此整个表达式首先会执行 (a = b + 2),然后执行 (b = c - 3),最后返回 c * 2 的值。因此结果为 (15 * 2) = 30。
? 复杂条件表达式
#include <stdio.h>int main() { int a = 5, b = 10, c = 15; int result; result = (a > b) ? ((b > c) ? (a + b) : (b + c)) : (a + c); // 20 printf("Result = %d\n", result); return 0;}
在这个示例中,先判断 (a > b),如果为真则进一步判断 (b > c),如果也为真则返回 (a + b),否则返回 (b + c);如果 (a > b) 为假,则直接返回 (a + c)。因为在这个示例中 (a > b) 为假,所以返回结果为20。
?运算符优先级的重要性
深入理解运算符优先级对于编写高效、清晰的代码至关重要。在编写复杂表达式时,合理使用括号可以消除歧义,并确保表达式按照预期的顺序计算。错误的运算符优先级使用可能导致意外的结果,因此程序员应该牢记优先级规则并善加利用。