C 中的运算符


2021年8月23日, Learn eTutorial
3013

在本教程中,您将通过简单易懂的示例,掌握使用 C 中各种运算符进行逻辑和算术计算的技能。
运算符是执行某种计算的独特符号。运算符作用于其上的对象或值称为操作数,而运算符和操作数的组合在 c 中称为表达式。

Operators and Operands in C expressions

C 语言支持各种内置运算符来操作数据和值,因此可广泛分为以下几类:

Operators in C

算术运算符

与现实数学一样,C 的算术运算符执行除法、乘法、加法和减法。涉及的运算符分别是 '/', '*', '+' 和 '-'。除了这些,还有另外三个运算符:取模、自增和自减运算符。取模运算符 '%' 输出数字相除的余数。

运算符 含义 描述 示例
+ 加法 两个操作数的加法或一元加 10+2=12
- 减法 从左操作数中减去右操作数或一元减 10-2=8
* 乘法 将两个操作数相乘 10*2=20
/ 除法 将左操作数除以右操作数 10/2=5
% 取模 除法后的余数 10%2=0
++ 自增 值增加一个单位 ++a a++ = a+1
-- 自减 值减少一个单位 --b b-- = b-1

算术运算符示例

#include <stdio.h>
int main()
{
    int x = 7,y = 3, z;

    z = x+y;
    printf("Sum: x+y = %d \n",z);
    z = x-y;
    printf("Difference: x-y = %d \n",z);
    z = x*y;
    printf("Product: x*y = %d \n",z);
    z = x/y;
    printf("Quotient: x/y = %d \n",z);
    z = x%y;
    printf("Remainder: x%y = %d \n",z);

    return 0;
}
Output:
Sum: x+y = 10
Difference: x-y = 4
Product: x*y = 21
Quotient: x/y = 2
Remainder: xy = 1

自增和自减运算符

自增运算符“++”将整数的值增加一个单位,而自减运算符“--”则将该值减少一个单位。这些运算符可以放在操作数的前面或后面,并广泛用于 C 中的不同类型的循环中。

自增和自减运算符示例

Example of Increment and Decrement Operators
#include <stdio.h>
int main()
{
    int x = 7,y = 3;
  
    printf("Increment: ++x = %d \n",++x);
    printf("Decrement: --y = %d \n",--y);
    return 0;
}

输出

Increment: ++x = 8
Decrement: --y = 2

关系运算符

关系运算符通过比较数据来给出二元输出,即真或假。以下是使用两个操作数 a 和 b 演示的六个运算符。

运算符 含义 描述 示例
== 等于 如果两个操作数相等,则返回 True a==b
!= 不等于 如果两个操作数不相等,则返回 True a!=b
大于 如果左操作数大于右操作数,则返回 True a>b
小于 如果左操作数小于右操作数,则返回真 a<b
>= 大于或等于 如果左操作数大于或等于右操作数,则返回 True a>=b
<= 小于或等于 如果左操作数小于或等于右操作数,则返回真 a<=b

关系运算符示例

#include <stdio.h>
int main()
{
    int x = 7,y = 3,z;
    z = x>y;
    printf("%d is greater than %d is %d\n",x,y,z);
    z = x=y;
    printf("%d is greater than %d is %d\n",x,y,z);
    z = x<=y;
    printf("%d is greater than %d is %d\n",x,y,z);
    z = x==y;
    printf("%d is greater than %d is %d\n",x,y,z);
    z = x!=y;
    printf("%d is greater than %d is %d \n",x,y,z);

    return 0;
} 

输出

7 is greater than 3 is 1
7 is less than 3 is 0
7 is greater than 3 is 1
7 is greater than 3 is 0
7 is greater than 3 is 0
7 is greater than 3 is 1

逻辑运算符

这些运算符执行二元运算,以在机器级别(如 AND、OR、NOR、NAND 等逻辑门)处理数据。如果结果为真,则通过返回“1”来表示。负结果表示为“0”。以下是 C 中三个基本逻辑运算符的描述,它们广泛用于决策制定。

运算符 含义 描述 示例
&& 逻辑与/合取 当且仅当两个语句都为真时,才返回 True X 和 Y
|| 逻辑或/析取 如果任何一个语句为真,则返回 True X 或 Y
! 逻辑非/否定 如果操作数为否定,则返回真 非 X

为了更好地理解逻辑运算符,您应该了解真值表。

Truth Table for Logical Operators

逻辑运算符的真值表

AND 的补码称为 NAND,OR 的补码称为 NOR。它们与其他运算符结合使用,例如 A! &B、A! =B 等。

逻辑运算符示例

#include <stdio.h>
int main()
{
    int x = 7,y = 3,z;
    z = (x==7)&&(x>y);
    printf("(x==7)&&(x>y) is %d\n",z);
    z = (x==7)||(x>y);
    printf("(x==7)||(x>y) is %d\n",z);
    z = (x!=7)||(y!=3);
    printf("(x!=7)&&(y!=) is %d\n",z);
    return 0;
}

输出

(x==7)&&(x>y) is 1
(x==7)||(x>y) is 1
(x!=7)&&(y!=) is 0

下表列出了常见的位运算符。3 的二进制表示是 0000 0011,4 的二进制表示是 0000 0100。

运算符 含义 描述 示例
& 按位与 如果两个操作数都为真,则结果为 1,否则为 0 3&4 =0 Logical And Example
| 按位或 如果任一操作数为真,则结果为 1,否则为 0 3|4=7 Logical Or Example
^ 按位异或 如果两个操作数不同,结果为 1;如果两个操作数相同,结果为 0 3^4=7 Logical XOR Example
~ 按位非 结果是操作数的否定 ~3= -(4) Binary Ones Complement Example
<<  按位左移 将位向左对齐 3<<2 = 12  
>>  按位右移 将位向右对齐 3>>2 = 0  

第一个运算符 '&' 是 AND 类型,如果位同时存在于两个操作数中,则将其复制到结果中。'|' 用作 OR 运算符。如果位存在于一个或两个操作数中,它会复制该位。'^' 表示 XOR 操作。如果它存在于任何一个操作数但不是两个操作数,则为正。除了这些,还有一个补码运算符,它具有翻转位的效果。它用 '~' 符号表示。

位运算符示例

#include <stdio.h>
int main()
{
    int x = 3,y = 4,z;
    z = x&y;
    printf("x&y is %d\n",z);
    z = x|y;
    printf("x&y is %d\n",z);
    z = x^y;
    printf("x&y is %d\n",z);
    printf("x&y is %d\n",~x);
    return 0;
} 

输出

x&y is 0
x|y is 7
x^y is 7
~x is -4

C 中的移位运算符

位移位运算符 '<<' 和 '>>' 分别称为二进制左移和右移运算符。操作数的值由右侧指定的量向左移动。

Bitwise Shift Left Representation

位左移表示

Bitwise Shift RightRepresentation

位左移表示

位移位运算符示例

#include <stdio.h>
int main()
{
    int x = 3;

    printf("x<<1 is %d\n",x<<1);
    printf("x<<2 is %d\n",x<<2);
    printf("x<<2 is %d\n\n",x<<3);

    printf("x>>1 is %d\n",x>>1);
    printf("x>>2 is %d\n",x>>2);
    printf("x>>3 is %d\n",x>>3);

    return 0;
} 

输出

x<<1 is 6
x<<2 is 12
x<<2 is 24

x>>1 is 1
x>>2 is 0
x>>2 is 0

我们在哪里使用位运算符?

由于位运算符用于操作比特级数据,因此在现实世界中不常见。然而,它们在低级语言或称机器语言的世界中占据主导地位。众所周知,低级操作使用二进制格式的 0 和 1 来操作数据。以下是一些使用位运算符的领域。

  • 主要用于嵌入式系统
  • 数据压缩 - winrar,zip
  • 加密
  • 网络
  • 硬件操作
  • 图形

赋值运算符

顾名思义,赋值运算符用于为变量赋值。'='(等于)是最基本的一种,将右侧的值赋给左侧。C=A+B 将把 (A+B) 的值赋给 C。下表列出了 C 中用于执行算术运算的其他赋值运算符。

运算符 示例 含义
= a = 10  
+= a+=10 a=a+10
-= a-=10 a=a-10
*= a*=10 a=a*10
/= a/=10 a=a/10
%= a%=10 a=a

赋值运算符示例

#include <stdio.h>
int main()
{
    int x = 10, a;

    a = x;
    printf("a = %d\n", a);
    a += x;
    printf("a = %d\n", a);
    a -= x;
    printf("a = %d\n", a);
    a *= x;
    printf("a = %d\n", a);
    a /= x;
    printf("a = %d\n", a);
    a %= x;
    printf("a = %d\n", a);

    return 0;
} 

输出

a = 10
a = 20
a = 10
a = 100
a = 10
a = 0

特殊运算符

sizeof 运算符

这个一元运算符以字节为单位返回操作数的大小。例如,对于整数,它将返回 4。它对于大型程序的空间管理非常有帮助。

sizeof 运算符示例

#include <stdio.h>
void main()
{

int a;
int short b;
short c;
int long d;
long e;
 printf(" Size of  a is %d\n",sizeof(a));
 printf(" Size of  b is %d\n",sizeof(b));
 printf(" Size of  c is %d\n",sizeof(c));
 printf(" Size of  d is %d\n",sizeof(d));
 printf(" Size of  e is %d\n",sizeof(e));

}

输出

 Size of  a is 4
 Size of  b is 2
 Size of  c is 2
 Size of  d is 4
 Size of  e is 4

条件/三元运算符(?:)

这些是一些在 c 中定义的独特运算符,称为三元运算符。'?:' 也称为条件运算符,广泛用于决策制定和将程序执行流路由到期望的方向。语法通常是 (exp)?A:B,表示如果表达式为真,则返回 A,否则返回 B。下面的程序说明了这一点

条件运算符示例

#include <stdio.h>
void main()
{
    int x=7,z;
    z=(x==8)? "True" : "False"  ;
     printf("Value of x is 7 ? %s\n",z);

} 

输出

 Value of x is 7 ? False

引用或指针运算符 (&)

引用运算符将返回任何变量的地址,方法是在变量名后加上它。您将在接下来的 C 指针教程中看到此引用运算符的用法。

解引用运算符(*)

广泛使用的运算符 '*' 表示的指针变量属于此类别,您将在我们的指针教程中稍后学习。

运算符的优先级

现在我们已经掌握了 C 中几乎所有运算符的知识。然而,我们经常会遇到需要同时处理不同类型运算符的情况。如果我们不遵循正确的应用顺序,程序最终会崩溃。

运算符优先级是指运算符在其中求值表达式的顺序。以下是编译器维护的我们必须遵守的顺序

  1. 后缀    () [] ->
  2. 一元
  3. 乘法/除法     
  4. 加法/减法    
  5. 移位    
  6. 关系    
  7. 相等    
  8. 按位与
  9. 按位异或    
  10. 按位或
  11. 逻辑与
  12. 逻辑或
  13. 条件
  14. 赋值