目录
C语言运算符概述
C语言运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,可以分为以下几类:
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
下面将结合实例简要讲解几种主要运算符,突出重点及难点。
1. 算术运算符
用于进行数学运算,包括加(+
)、减(-
)、乘(*
)、除(/
)、取余(%
)、自增(++)、自减(--)。
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 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. 位运算符
用于对整数的二进制表示进行操作,包括与(&
)、或(|
)、异或(^
)、取反(~
)、左移(<<
)、右移(>>
)。
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设如果 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. 复合赋值运算符
复合赋值运算符是一种简化赋值操作的方式,它将赋值和运算结合在一起。常见的复合赋值运算符有:
+=
:加法赋值-=
:减法赋值*=
:乘法赋值/=
:除法赋值%=
:取余赋值&=
:按位与赋值|=
:按位或赋值^=
:按位异或赋值<<=
:左移赋值>>=
:右移赋值
例子说明:
-
加法赋值
+=
:int x = 5; x += 3; // 等同于 x = x + 3; 结果 x 为 8
-
减法赋值
-=
:int y = 10; y -= 4; // 等同于 y = y - 4; 结果 y 为 6
-
乘法赋值
*=
:int z = 2; z *= 5; // 等同于 z = z * 5; 结果 z 为 10
-
除法赋值
/=
:int m = 20; m /= 4; // 等同于 m = m / 4; 结果 m 为 5
-
取余赋值
%=
:int n = 15; n %= 4; // 等同于 n = n % 4; 结果 n 为 3
-
按位与赋值
&=
:int p = 6; // 二进制为 0110 p &= 3; // 二进制为 0011, 结果为 2 (二进制为 0010)
-
按位或赋值
|=
:int q = 5; // 二进制为 0101 q |= 3; // 二进制为 0011, 结果为 7 (二进制为 0111)
-
按位异或赋值
^=
:int r = 4; // 二进制为 0100 r ^= 1; // 二进制为 0001, 结果为 5 (二进制为 0101)
-
左移赋值
<<=
:int s = 2; // 二进制为 0010 s <<= 1; // 左移一位,结果为 4 (二进制为 0100)
-
右移赋值
>>=
:int t = 8; // 二进制为 1000 t >>= 2; // 右移两位,结果为 2 (二进制为 0010)
重点:复合赋值运算符简化了代码。
总结
C语言运算符种类繁多,理解各类运算符的优先级及用法是编写高效代码的基础,尤其需要注意整除和位运算的特殊性。