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

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 |
为了更好地理解逻辑运算符,您应该了解真值表。
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 ![]() |
| | | 按位或 | 如果任一操作数为真,则结果为 1,否则为 0 | 3|4=7 ![]() |
| ^ | 按位异或 | 如果两个操作数不同,结果为 1;如果两个操作数相同,结果为 0 | 3^4=7 ![]() |
| ~ | 按位非 | 结果是操作数的否定 | ~3= -(4) ![]() |
| << | 按位左移 | 将位向左对齐 | 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
位移位运算符 '<<' 和 '>>' 分别称为二进制左移和右移运算符。操作数的值由右侧指定的量向左移动。
#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 来操作数据。以下是一些使用位运算符的领域。
顾名思义,赋值运算符用于为变量赋值。'='(等于)是最基本的一种,将右侧的值赋给左侧。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
这个一元运算符以字节为单位返回操作数的大小。例如,对于整数,它将返回 4。它对于大型程序的空间管理非常有帮助。
#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 中几乎所有运算符的知识。然而,我们经常会遇到需要同时处理不同类型运算符的情况。如果我们不遵循正确的应用顺序,程序最终会崩溃。
运算符优先级是指运算符在其中求值表达式的顺序。以下是编译器维护的我们必须遵守的顺序