C语言运算符详解:从入门到精通

C语言是一种高效、灵活的编程语言,广泛应用于系统编程、嵌入式开发和高性能计算等领域。运算符是C语言的基础组成部分,用于执行各种数学运算、逻辑判断和位操作。熟练掌握C语言的运算符及其用法,是编写高效代码的关键。

本文将全面介绍C语言的各类运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等,并通过丰富的代码示例帮助读者深入理解其使用方法和优先级规则。

算术运算符

算术运算符用于执行基本的数学运算,如加、减、乘、除等。

运算符描述实例
+把两个操作数相加A + B 将得到 30
-从第一个操作数中减去第二个操作数A - B 将得到 -10
*把两个操作数相乘A * B 将得到 200
/分子除以分母B / A 将得到 2
%取模运算符,整除后的余数B % A 将得到 0
++自增运算符,整数值增加 1A++ 将得到 11
--自减运算符,整数值减少 1A-- 将得到 9

示例代码

#include <stdio.h>

int main() {
    int a = 10, b = 3;
    
    printf("a + b = %d\n", a + b);  // 13
    printf("a - b = %d\n", a - b);  // 7
    printf("a * b = %d\n", a * b);  // 30
    printf("a / b = %d\n", a / b);  // 3(整数除法)
    printf("a %% b = %d\n", a % b); // 1
    
    int c = 5;
    printf("c++ = %d\n", c++); // 5(先使用后自增)
    printf("++c = %d\n", ++c); // 7(先自增后使用)
    
    return 0;
}

注意事项

  • / 在整数运算时是整除,如 5 / 2 = 2,若需浮点数结果,应使用 5.0 / 2

  • % 只能用于整数运算。

  • ++a(前缀自增)先自增再使用,a++(后缀自增)先使用再自增。

关系运算符

关系运算符用于比较两个值,返回 1(真)或 0(假)。

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。

示例代码

#include <stdio.h>

int main() {
    int x = 10, y = 20;
    
    printf("x == y: %d\n", x == y);  // 0
    printf("x != y: %d\n", x != y);  // 1
    printf("x > y: %d\n", x > y);    // 0
    printf("x < y: %d\n", x < y);    // 1
    printf("x >= y: %d\n", x >= y);  // 0
    printf("x <= y: %d\n", x <= y);  // 1
    
    return 0;
}

应用场景

  • 常用于 ifwhile 等条件判断语句。

逻辑运算符

逻辑运算符用于组合多个条件,返回 1(真)或 0(假)。

运算符描述实例
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(A || B) 为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

示例代码

#include <stdio.h>

int main() {
    int a = 1, b = 0;
    
    printf("a && b: %d\n", a && b);  // 0
    printf("a || b: %d\n", a || b);  // 1
    printf("!a: %d\n", !a);          // 0
    
    return 0;
}

短路求值

  • && 如果第一个表达式为假,则不会计算第二个表达式。

  • || 如果第一个表达式为真,则不会计算第二个表达式。

位运算符

位运算符直接对二进制位进行操作,适用于底层编程。

运算符描述实例
&

对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。

按位与操作,按二进制位进行"与"运算。运算规则:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;
(A & B) 将得到 12,即为 0000 1100
|

对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。

按位或运算符,按二进制位进行"或"运算。运算规则:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;
(A | B) 将得到 61,即为 0011 1101
^

对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。

异或运算符,按二进制位进行"异或"运算。运算规则:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;
(A ^ B) 将得到 49,即为 0011 0001
~

对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。

取反运算符,按二进制位进行"取反"运算。运算规则:

~1=-2;   
~0=-1;
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<

将操作数的所有位向左移动指定的位数。左移 n 位相当于乘以 2 的 n 次方。

二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

A << 2 将得到 240,即为 1111 0000
>>

将操作数的所有位向右移动指定的位数。右移n位相当于除以 2 的 n 次方。

二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。

A >> 2 将得到 15,即为 0000 1111

示例代码

#include <stdio.h>

int main() {
    unsigned int a = 5;  // 0101
    unsigned int b = 3;  // 0011
    
    printf("a & b: %u\n", a & b);  // 0001 (1)
    printf("a | b: %u\n", a | b);  // 0111 (7)
    printf("a ^ b: %u\n", a ^ b);  // 0110 (6)
    printf("~a: %u\n", ~a);        // 111...1010(取决于位数)
    printf("a << 1: %u\n", a << 1); // 1010 (10)
    printf("a >> 1: %u\n", a >> 1); // 0010 (2)
    
    return 0;
}

应用场景

  • 位掩码操作(如权限控制)

  • 优化计算(如 x << 1 相当于 x * 2

赋值运算符

赋值运算符用于给变量赋值,并可以结合算术或位运算。

运算符描述实例
=简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A
<<=左移且赋值运算符C <<= 2 等同于 C = C << 2
>>=右移且赋值运算符C >>= 2 等同于 C = C >> 2
&=按位与且赋值运算符C &= 2 等同于 C = C & 2
^=按位异或且赋值运算符C ^= 2 等同于 C = C ^ 2
|=按位或且赋值运算符C |= 2 等同于 C = C | 2

示例代码

#include <stdio.h>

int main() {
    int a = 10;
    
    a += 5;  // a = 15
    a -= 3;  // a = 12
    a *= 2;  // a = 24
    a /= 4;  // a = 6
    a %= 5;  // a = 1
    
    printf("Final a: %d\n", a);  // 1
    
    return 0;
}

其他运算符

运算符描述实例
sizeof()返回变量的大小。sizeof(a) 将返回 4,其中 a 是整数。
&返回变量的地址。&a; 将给出变量的实际地址。
*指向一个变量。*a; 将指向一个变量。
? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y

(1)条件运算符(三元运算符)

int max = (a > b) ? a : b;

(2)sizeof 运算符

printf("Size of int: %zu\n", sizeof(int));

(3)逗号运算符

int x = (a=5, b=10, a+b);  // x = 15

运算符优先级

运算符的优先级确定表达式中项的组合。这会影响到一个表达式如何计算。某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级。

例如 x = 7 + 3 * 2,在这里,x 被赋值为 13,而不是 20,因为运算符 * 具有比 + 更高的优先级,所以首先计算乘法 3*2,然后再加上 7。

下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

类别 运算符 结合性 
后缀 () [] -> . ++ - -  从左到右 
一元 + - ! ~ ++ - - (type)* & sizeof 从右到左 
乘除 * / % 从左到右 
加减 + - 从左到右 
移位 << >> 从左到右 
关系 < <= > >= 从左到右 
相等 == != 从左到右 
位与 AND 从左到右 
位异或 XOR 从左到右 
位或 OR 从左到右 
逻辑与 AND && 从左到右 
逻辑或 OR || 从左到右 
条件 ?: 从右到左 
赋值 = += -= *= /= %=>>= <<= &= ^= |= 从右到左 
逗号 从左到右 

示例

#include <stdio.h>
 
int main()
{
   int a = 20;
   int b = 10;
   int c = 15;
   int d = 5;
   int e;
 
   e = (a + b) * c / d;      // ( 30 * 15 ) / 5
   printf("(a + b) * c / d 的值是 %d\n",  e );
 
   e = ((a + b) * c) / d;    // (30 * 15 ) / 5
   printf("((a + b) * c) / d 的值是 %d\n" ,  e );
 
   e = (a + b) * (c / d);   // (30) * (15/5)
   printf("(a + b) * (c / d) 的值是 %d\n",  e );
 
   e = a + (b * c) / d;     //  20 + (150/5)
   printf("a + (b * c) / d 的值是 %d\n" ,  e );
  
   return 0;
}

总结

本文详细介绍了C语言的各种运算符,包括算术运算、关系运算、逻辑运算、位运算、赋值运算等,并通过示例演示了它们的用法。掌握这些运算符及其优先级,是编写高效C程序的基础。

在实际编程中,建议:

  1. 使用括号明确运算顺序,避免歧义。

  2. 注意 ++ 和 -- 的前缀与后缀区别。

  3. 位运算适用于底层优化,但需谨慎使用。

希望本文能帮助你更好地理解和运用C语言的运算符!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值