解码C语言运算符

算术运算符

运算符 描述 示例 结果
+ 加法 5 + 3 8
- 减法 5 - 3 2
* 乘法 5 * 3 15
/ 除法 5 / 2 2
% 取模 5 % 2 1
++ 自增 a++ a+1
-- 自减 a-- a-1

注意:

  • 整数除法会截断小数部分
  • 取模运算只能用于整数类型

C语言中前缀与后缀自增自减运算符的区别

前缀形式(先增减)
  • ++variable:先自增,后使用
  • --variable:先自减,后使用
后缀形式(后增减)
  • variable++:先使用,后自增
  • variable--:先使用,后自减
区别对比表
特性 前缀形式 (++a, --a) 后缀形式 (a++, a--)
执行顺序 先增减,后使用 先使用,后增减
返回值 返回增减后的值 返回增减前的值
性能 通常更高效 可能稍低(需要临时变量)
常见用途 需要立即使用新值 需要先使用原值
代码示例
#include <stdio.h>

int main() {
    int a = 5, b = 5;
    int x, y;

    // 前缀:先自增,后赋值
    x = ++a;
    printf("前缀: a = %d, x = %d\n", a, x); // a=6, x=6

    // 后缀:先赋值,后自增
    y = b++;
    printf("后缀: b = %d, y = %d\n", b, y); // b=6, y=5

    return 0;
}

关系运算符

运算符 描述 示例 结果
== 等于 5 == 3 0
!= 不等于 5 != 3 1
> 大于 5 > 3 1
< 小于 5 < 3 0
>= 大于等于 5 >= 3 1
<= 小于等于 5 <= 3 0

逻辑运算符

运算符 描述 示例 结果
&& 逻辑与(全真为真,有假为假,若第一个为假则第二个不判断(短路) (5>3) && (2>1) 1
|| 逻辑或(全假为假,有真为真,若第一个为真则第二个不判断(短路)) (5>3) || (2<1) 1
! 逻辑非 !(5>3) 0

位运算符(以二进制形式进行位操作)

运算符 描述 示例 结果
& 按位与 5 & 3 1
| 按位或 5 | 3 7
^ 按位异或 5 ^ 3 6
~ 按位取反 ~5 -6
<< 左移(移出丢弃,空出补0) 5 << 1 10
>> 右移(移出丢弃,空出补符号位) 5 >> 1 2

赋值运算符

运算符 描述 等价于
= 简单赋值 a = 5
+= 加后赋值 a += 5a = a + 5
-= 减后赋值 a -= 5a = a - 5
*= 乘后赋值 a *= 5a = a * 5
/= 除后赋值 a /= 5a = a / 5
%= 取模后赋值 a %= 5a = a % 5
&= 按位与后赋值 a &= 5a = a & 5
|= 按位或后赋值 a |= 5a = a | 5
^= 按位异或后赋值 a ^= 5a = a ^ 5
<<= 左移后赋值 a <<= 5a = a << 5
>>= 右移后赋值 a >>= 5a = a >> 5

其他运算符

运算符 描述 示例
sizeof() 返回变量或类型的大小 sizeof(int)
& 取地址运算符 &a
* 指针运算符 *ptr
?: 条件运算符 a > b ? a : b
, 逗号运算符 a = (b=3, b+2)a=5
[] 下标运算符 arr[5]
-> 结构体指针成员访问 ptr->member
. 结构体成员访问 struct.member

运算符优先级

从高到低排列:

运算符 结合性 说明
() [] -> . ++ -- 左到右 [1] 后缀操作
! ~ ++ -- + - (type) * & sizeof 右到左 [2] 一元操作
* / % 左到右 乘除运算
+ - 左到右 加减运算
<< >> 左到右 位移运算
< <= > >= 左到右 关系比较
== != 左到右 相等比较
& 左到右 按位与
^ 左到右 按位异或
| 左到右 按位或
&& 左到右 逻辑与
|| 左到右 逻辑或
?: 右到左 条件运算符
= += -= *= /= %= <<= >>= &= ^= |= 右到左 赋值运算符
, 左到右 逗号运算符

代码示例

#include <stdio.h>

#include <stdio.h>

int main() {
    // 算术运算符
    int a = 10, b = 3;
    printf("算术运算:\n");
    printf("%d + %d = %d\n", a, b, a + b);  // 10 + 3 = 13
    printf("%d / %d = %d\n", a, b, a / b);  // 10 / 3 = 3(整数除法,小数部分被截断)

    // 关系运算符
    printf("\n关系运算:\n");
    printf("%d > %d = %d\n", a, b, a > b);  // 10 > 3 = 1(真)

    // 逻辑运算符
    printf("\n逻辑运算:\n");
    printf("(%d>%d) && (%d<%d) = %d\n", a, b, a, b, (a>b) && (a<b));  
    // (10>3) && (10<3) = 0(真 && 假 = 假)

    // 位运算
    printf("\n位运算:\n");
    printf("%d & %d = %d\n", a, b, a & b);  // 10 & 3 = 2
    // 10的二进制: 1010, 3的二进制: 0011
    // 按位与结果: 0010 = 2

    // 赋值运算
    int c = a;      // c = 10
    c += 5;         // c = 10 + 5 = 15
    printf("\n赋值运算: c = %d\n", c);  // 输出: c = 15

    // 条件运算符
    int max = (a > b) ? a : b;  // 10 > 3 为真,所以 max = a = 10
    printf("最大值: %d\n", max);  // 输出: 最大值: 10

    return 0;
}
posted @ 2025-09-17 20:28  YouEmbedded  阅读(61)  评论(0)    收藏  举报