运算符

运算符用于执行任何类型的运算,如算术,逻辑运算等。运算符根据其功能进行划分种类。
例如:
sum=4+5 —> 这里的'+' 和 '=' 符号都是运算符.
运算符'+'号用于4和5的加法运算,运算符'='用于把相加的结果赋值给sum。

运算符分类

根据运算符的功能,分为以下几类:

  1. 算术运算符
  2. 比较运算符
  3. 逻辑运算符
  4. 位运算符
  5. 复合赋值运算符
  6. 三目运算符

算术运算符

各种算术运算符如下表所示:

算术运算符 符号 用例 备注
加法运算 + a + b a和b均为变量
减法运算 - a - b a和b均为变量
乘法运算 * a * b a和b均为变量
除法运算 / a / b a和b均为变量
取模运算 % a % b a和b均为变量
赋值 = a = b a和b均为变量

对于算术运算,我们可以说是非常熟悉了,但其中除法和取模运算比较特别,我们快速了解一下,它们的特别之处。

除法和取模运算符

小学学习数学时,我们就知道,当一个数除以另一个数时,所得的结果即为商,除不尽剩余的数值则为余数。
因此,通过运算符'/'进行除法运算,所得的结果即为商;通过'%'运算符进行取模运算,所得的结果即为余数。例如:
情况1:如果a> b; a和b是整数变量

a=10 ,b=8 
那么
c=a/b=10/8=1
c=a%b=10%8=2

情况2:如果a <b; a和b是整数变量

a=8 ,b=10
那么
c=a/b=8/10=0
c=a%b=8%10=8

情况3:如果a = b; a和b是整数变量

a=10 ,b=10 
那么
c=a/b=10/10=1
c=a%b=10%10=0

情况4: 在Float变量上,取模运算无效

#include<stdio.h>
 
int main( ) 
{
 
    double f_var1=4.5;
    double i_var2=91;
    double result_div;
    int result_mod;

    result_div =i_var2/f_var1;
    result_mod =i_var2%f_var1;

    printf("%lf\n",result_div);
    printf("%d",result_mod);

    return 0;
}

以上例程是对浮点数进行取模运算,编译器会直接提示无效操作,结果如下:
浮点数取模运算

比较运算符

在条件语句中使用比较运算符来执行某些操作。比较运算符执行结果是truefalse。通常编译器对true的定义为1,false的定义为0。

以下是比较运算符列表

比较运算符 符号 用例
全等于 == a == b
不等于 != a != b
大于 > a > b
小于 < a < b
大于或等于 >= a >= b
小于等于 <= a <= b

逻辑运算符

在条件语句中,有时候会使用逻辑运算符来执行某些操作。逻辑运算符执行结果和比较运算符一样,也是truefalse。逻辑运算符主要有三个:

  1. 逻辑与(&&)
  2. 逻辑或(||)
  3. 逻辑非(!)

逻辑与(&&)
当需要满足所有条件才能执行某些任务时,在条件之间使用逻辑与(&&)运算符。

假设有两个条件Condition1和Condition2,让我们看一下在这些条件之间使用逻辑与(&&)运算的结果。
逻辑与运算
注意:所有非零数,无论是正数还是负数,都将被视为True,只有零会被视为False。
例如:
4 && 5 = 1 (True)
4 && 0 = 0 (False)
-1 && 1 = 1 (True)
-4 && 1 = 1 (True)
(9> 8)&& (4 <5)= 1 (True)

逻辑或(||)
当只需要满足一个条件即可执行某些任务时,在条件之间使用逻辑或(||)运算符。

假设有两个条件Condition1和Condition2,让我们看一下在这些条件之间使用逻辑或(||)运算的结果。
逻辑或运算
例如:
4 || 5 = 1 (True)
4 || 0 = 1 (True)
1 || 0 = 1 (True)
-4 || 1 = 1 (True)
(9> 8) || (4> 5)= 1 (True)
0 || 0 = False (False)

逻辑非(!)
逻辑非仅在单个条件下起作用,它使条件的当前状态无效。
例如:
! (True) = 0
! (False) = 1

逻辑运算例程

#include<stdio.h>
 
int main( ) 
{
    unsigned int u32_var1=40;
    unsigned int u32_var2=50;
    unsigned char u8_logicalResult;

    /*logical AND operation*/
    u8_logicalResult=u32_var1 && u32_var2;
    printf("Logical AND operation result=%u\n",u8_logicalResult);

    /*logical OR operation*/
    u8_logicalResult=u32_var1 || u32_var2;
    printf("Logical OR operation result=%u\n",u8_logicalResult);

    /*logical NOT operation*/
    u8_logicalResult=!u32_var1;
    printf("Logical NOT operation result=%u\n",u8_logicalResult);

    return 0;
}

以上程序任务分别执行逻辑与、或、非运算,并输出结果。程序执行结果如下:
logicalprogram

位运算符

如果说逻辑运算符是将整个数字视为1或0,并以1和0给出输出,即True和False;那么位运算符则是对数字的每一位进行运算。
例如:
4(逻辑与)5 -->输出结果:1(True)
4(位与)5 -->0100(位与)0101-->输出结果:0100 (每一位都进行与操作)

以下是位运算符列表。

位运算符 符号 用例
位与 & a & b
位或 | a | b
位异或 ^ a ^ b
位左移 << a << b
位右移 >> a >> b

位运算表
位与

0 & 0 =0
0 & 1 =0
1 & 0 =0
1 & 1 =1

位或

0 | 0 =0
0 | 1 =1
1 | 0 =1
1 | 1 =1

位异或

0 ^ 0 =0
0 ^ 1 =1
1 ^ 0 =1
1 ^ 1 =0

例程

例程1:

位与:
执行 4&5 --
 
4=  0 1 0 0
    & & & &
5=  0 1 0 1
---------------
    0 1 0 0
----------------

例如2:

位或:
执行 4 | 5 --
 
4=  0 1 0 0
    | | | |
5=  0 1 0 1
---------------
    0 1 0 1
----------------

例如3:

位左移:
执行10<<2 ----
 
10     =  0 0 0 0 1 0 1 0
10<<1  =  0 0 0 1 0 1 0 0  (<<1)--step1
10<<2  =  0 0 1 0 1 0 0 0  (<<2)--step2

例如4:

位右移:
执行10>>2 ----
10     =  0 0 0 0 1 0 1 0
10>>1  =  0 0 0 0 0 1 0 1  (>>1)--step1
10>>2  =  0 0 0 0 0 0 1 0  (>>2)--step2

位操作程序

#include<stdio.h>
 
int main( ) 
{
    unsigned int u32_var1=40;
    unsigned int u32_var2=50;
    unsigned int u32_bitResult;

    /*Bitwise AND operation*/
    u32_bitResult=u32_var1 & u32_var2;
    printf("Bitwise AND operation result=%u\n",u32_bitResult);

    /*Bitwise OR operation*/
    u32_bitResult=u32_var1 | u32_var2;
    printf("Bitwise OR operation result=%u\n",u32_bitResult);

    /*Bitwise XoR operation*/
    u32_bitResult=u32_var1 ^ u32_var2;
    printf("Bitwise XoR operation result=%u\n",u32_bitResult);

    /*Bitwise Left Shift operation*/
    u32_bitResult=u32_var1<<3;
    printf("Bitwise Left Shift operation result=%u\n",u32_bitResult);

    /*Bitwise Right Shift operation*/
    u32_bitResult=u32_var1>>3;
    printf("Bitwise Right Shift operation result=%u\n",u32_bitResult);
 
    return 0;
}

以上程序的任务是分别执行位与、位或、位异或、位左移和位右移运算,并输出运算结果。程序执行结果如下:
位运算程序

复合赋值运算符

复合赋值运算符是两个运算的组合。第一个运算可以是任何算术运算或按位运算,但第二个运算必须是赋值运算。

因此,我们不必为两个操作编写两个单独的语句,而可以通过使用单个复合赋值运算符来完成它。这种方法能够使C代码看起来更加简洁,同时也会提升代码执行效率。

例如,执行a和b的加法运算并将该和赋值给a。为此,我们有两种方法:
a = a + b;
a += b; (+=复合加法赋值运算符)

复合赋值运算符及其语法如下:

复合赋值运算符 符号 用例 等效运算
加法赋值 += a += b a = a + b
减法赋值 -= a -= b a = a - b
除法赋值 /= a /= b a = a / b
乘法赋值 *= a *= b a = a * b
取模赋值 %= a %= b a = a % b
位与赋值 &= a &= b a = a & b
位或赋值 |= a |= b a = a | b
位异或赋值 ^= a ^= b a = a ^ b
位左移赋值 <<= a <<= b a = a << b
位右移赋值 >>= a >>= b a = a >> b

三目运算符

三目运算符使用'?'和':'将三个关系式进行组合运算,因此它被称为三目运算符。语法如下:

(condition)? statment1 : statment2;

如果条件为True,则statment1将执行,否则,将执行statment2。
例如:

#include<stdio.h>

int main()
{
    int a, b;

    a = 10;
    b = 5;

    (a>b) ? printf("a is greater") : printf("b is greater");

    return 0;
}

以上程序的任务是使用三目运算符来比较a和b的大小,并根据比较结果打印比较情况。程序执行如下:
三目运算符例程

下一节