学懂C语言(九): C语言 运算符详解

        

目录

 C语言运算符概述

1. 算术运算符

2. 关系运算符

3. 逻辑运算符

4. 位运算符

5. 赋值运算符

 1. 简单赋值运算符 =

2. 复合赋值运算符

总结


 C语言运算符概述

        C语言运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,可以分为以下几类:

       算术运算符

       关系运算符

       逻辑运算符

       位运算符

      赋值运算符

      下面将结合实例简要讲解几种主要运算符,突出重点及难点。

1. 算术运算符

        用于进行数学运算,包括加(+)、减(-)、乘(*)、除(/)、取余(%)、自增(++)、自减(--)。

下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

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

实例

int a = 10, b = 3;
int c;
int sum = a + b;       // 加法,结果为13
int difference = a - b; // 减法,结果为7
int product = a * b;    // 乘法,结果为30
int quotient = a / b;   // 除法,结果为3(整除)
int remainder = a % b;  // 取余,结果为1
c = a++;  // 赋值后再加 1 ,c 为 10,a 为11
c = a--;  // 赋值后再减 1 ,c 为 11 ,a 为10

c = ++b;  //先加 1 再赋值 ,c 为 4,a 为4
c = --b;  // 先减 1 再 赋值,c 为 3 ,a 为3

重点

1、注意整除运算对整数的影响,a / b结果为整型,不会返回小数。

2、注意 a++ 与 ++a 、a-- 与--a 的区别。

2. 关系运算符

  用于比较两个值的关系,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。

下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:

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

实例

#include <stdio.h>
 
int main()
{
   int a = 21;
   int b = 10;
   int c ;
 
   if( a == b )
   {
      printf("Line 1 - a 等于 b\n" );
   }
   else
   {
      printf("Line 1 - a 不等于 b\n" );
   }
   if ( a < b )
   {
      printf("Line 2 - a 小于 b\n" );
   }
   else
   {
      printf("Line 2 - a 不小于 b\n" );
   }
   if ( a > b )
   {
      printf("Line 3 - a 大于 b\n" );
   }
   else
   {
      printf("Line 3 - a 不大于 b\n" );
   }
   /* 改变 a 和 b 的值 */
   a = 5;
   b = 20;
   if ( a <= b )
   {
      printf("Line 4 - a 小于或等于 b\n" );
   }
   if ( b >= a )
   {
      printf("Line 5 - b 大于或等于 a\n" );
   }
}

重点===的区别,==是比较,而=是赋值,常见错误。

3. 逻辑运算符

用于组合多个条件,包括与(&&)、或(||)、非(!)。

下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:

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

实例

#include <stdio.h>
 
int main()
{
   int a = 5;
   int b = 20;
   int c ;
 
   if ( a && b )
   {
      printf("Line 1 - 条件为真\n" );
   }
   if ( a || b )
   {
      printf("Line 2 - 条件为真\n" );
   }
   /* 改变 a 和 b 的值 */
   a = 0;
   b = 10;
   if ( a && b )
   {
      printf("Line 3 - 条件为真\n" );
   }
   else
   {
      printf("Line 3 - 条件为假\n" );
   }
   if ( !(a && b) )
   {
      printf("Line 4 - 条件为真\n" );
   }
}

重点:短路求值,&&左边为假时,右边不会计算。

4. 位运算符

用于对整数的二进制表示进行操作,包括与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)。

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:

pqp & qp | qp ^ q
00000
01011
11110
10011

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

下表显示了 C 语言支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

运算符描述实例
&

对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 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 = 60;    /* 60 = 0011 1100 */  
   unsigned int b = 13;    /* 13 = 0000 1101 */
   int c = 0;           
 
   c = a & b;       /* 12 = 0000 1100 */ 
   printf("Line 1 - c 的值是 %d\n", c );
 
   c = a | b;       /* 61 = 0011 1101 */
   printf("Line 2 - c 的值是 %d\n", c );
 
   c = a ^ b;       /* 49 = 0011 0001 */
   printf("Line 3 - c 的值是 %d\n", c );
 
   c = ~a;          /*-61 = 1100 0011 */
   printf("Line 4 - c 的值是 %d\n", c );
 
   c = a << 2;     /* 240 = 1111 0000 */
   printf("Line 5 - c 的值是 %d\n", c );
 
   c = a >> 2;     /* 15 = 0000 1111 */
   printf("Line 6 - c 的值是 %d\n", c );
}

难点:理解位运算的二进制操作,尤其是取反和移位的效果。

5. 赋值运算符

用于给变量赋值,包括简单赋值(=)和复合赋值(+=-=*=/=等)。

 1. 简单赋值运算符 =

简单赋值运算符用于将右侧的值赋给左侧的变量。例如:

int a = 10; // 将10赋值给变量a
int b = 20; // 将20赋值给变量b

2. 复合赋值运算符

复合赋值运算符是一种简化赋值操作的方式,它将赋值和运算结合在一起。常见的复合赋值运算符有:

  • +=:加法赋值
  • -=:减法赋值
  • *=:乘法赋值
  • /=:除法赋值
  • %=:取余赋值
  • &=:按位与赋值
  • |=:按位或赋值
  • ^=:按位异或赋值
  • <<=:左移赋值
  • >>=:右移赋值

例子说明:

  1. 加法赋值 +=

    int x = 5;
    x += 3; // 等同于 x = x + 3; 结果 x 为 8
    

  2. 减法赋值 -=

    int y = 10; y -= 4; // 等同于 y = y - 4; 结果 y 为 6
  3. 乘法赋值 *=

    int z = 2; z *= 5; // 等同于 z = z * 5; 结果 z 为 10
  4. 除法赋值 /=

    int m = 20; m /= 4; // 等同于 m = m / 4; 结果 m 为 5
  5. 取余赋值 %=

    int n = 15; n %= 4; // 等同于 n = n % 4; 结果 n 为 3
  6. 按位与赋值 &=

    int p = 6; // 二进制为 0110 
    p &= 3; // 二进制为 0011, 结果为 2 (二进制为 0010)
  7. 按位或赋值 |=

    int q = 5; // 二进制为 0101 
    q |= 3; // 二进制为 0011, 结果为 7 (二进制为 0111)
  8. 按位异或赋值 ^=

    int r = 4; // 二进制为 0100 r ^= 1; // 二进制为 0001, 结果为 5 (二进制为 0101)
  9. 左移赋值 <<=

    int s = 2; // 二进制为 0010 
    s <<= 1; // 左移一位,结果为 4 (二进制为 0100)
  10. 右移赋值 >>=

    int t = 8; // 二进制为 1000 
    t >>= 2; // 右移两位,结果为 2 (二进制为 0010)

重点:复合赋值运算符简化了代码。 

总结

        C语言运算符种类繁多,理解各类运算符的优先级及用法是编写高效代码的基础,尤其需要注意整除和位运算的特殊性。

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值