目录
编辑
1. 算术运算符
2. 关系运算符
3. 逻辑运算符
4. 位运算符
5. 赋值运算符
6. 杂项运算符 ↦ sizeof & 三元
6.1 sizeof()
6.2 &取地址运算符
6.3 *
6.4 三目运算符
7. 运算符优先级
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
1. 算术运算符
C语言中常用的算术运算符有加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
加法运算符(+)用于将两个操作数相加,例如:
int a = 5;
int b = 3;
int sum = a + b; // sum的值为8
减法运算符(-)用于将第一个操作数减去第二个操作数,例如:
int a = 5;
int b = 3;
int difference = a - b; // difference的值为2
乘法运算符(*)用于将两个操作数相乘,例如:
int a = 5;
int b = 3;
int product = a * b; // product的值为15
除法运算符(/)用于将第一个操作数除以第二个操作数,例如:
int a = 10;
int b = 3;
int quotient = a / b; // quotient的值为3
需要注意的是,如果两个操作数都为整数,使用除法运算符(/)得到的结果也会是整数,即只保留整数部分。如果想要得到精确的浮点数结果,可以将其中一个操作数转换为浮点数类型。
取模运算符(%)用于求两个操作数相除的余数,例如:
int a = 10;
int b = 3;
int remainder = a % b; // remainder的值为1
除了这些基本的算术运算符,C语言还提供了自增(++)和自减(--)运算符用于对变量进行加1或减1的操作。
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
代码示例:
#include <stdio.h>int main()
{int a = 21;int b = 10;int c ;c = a + b;printf("Line 1 - c 的值是 %d\n", c );c = a - b;printf("Line 2 - c 的值是 %d\n", c );c = a * b;printf("Line 3 - c 的值是 %d\n", c );c = a / b;printf("Line 4 - c 的值是 %d\n", c );c = a % b;printf("Line 5 - c 的值是 %d\n", c );c = a++; // 赋值后再加 1 ,c 为 21,a 为 22printf("Line 6 - c 的值是 %d\n", c );c = a--; // 赋值后再减 1 ,c 为 22 ,a 为 21printf("Line 7 - c 的值是 %d\n", c );}
运行结果:
2. 关系运算符
在C语言中,关系运算符用于比较两个值之间的关系,并返回一个布尔值(0表示假,非0表示真)。
以下是C语言中常用的关系运算符:
- 相等(==):判断两个操作数是否相等。
- 不等(!=):判断两个操作数是否不相等。
- 大于(>):判断第一个操作数是否大于第二个操作数。
- 小于(<):判断第一个操作数是否小于第二个操作数。
- 大于等于(>=):判断第一个操作数是否大于等于第二个操作数。
- 小于等于(<=):判断第一个操作数是否小于等于第二个操作数。
下面是一些使用关系运算符的例子:
int a = 5;
int b = 3;if (a == b) {// 执行代码块,当a等于b时
}if (a != b) {// 执行代码块,当a不等于b时
}if (a > b) {// 执行代码块,当a大于b时
}if (a < b) {// 执行代码块,当a小于b时
}if (a >= b) {// 执行代码块,当a大于等于b时
}if (a <= b) {// 执行代码块,当a小于等于b时
}
为了有个更直观的比对,我们以表格的形式呈现:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
3. 逻辑运算符
在C语言中,逻辑运算符用于对布尔表达式进行操作,常用的逻辑运算符有三种:与(&&)、或(||)和非(!)。
-
与(&&):当且仅当两个操作数都为真时,结果才为真。如果任何一个操作数为假,那么结果就为假。
-
或(||):只要有一个操作数为真,结果就为真。只有当两个操作数都为假时,结果才为假。
-
非(!):用于对操作数取反,如果操作数为真,则结果为假;如果操作数为假,则结果为真。
逻辑运算符通常用于条件判断语句中,例如if语句、while循环等,用于组合多个条件,以便根据这些条件确定程序的执行流程。
下面是一个简单的示例,演示了逻辑运算符的使用:
int a = 5, b = 3, c = 7;if (a > b && b > c) {printf("a大于b且b大于c\n");
} else if (a > b || b > c) {printf("a大于b或者b大于c\n");
} else if (!(a > b)) {printf("a不大于b\n");
}
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
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 |
在C语言中,位运算符用于对整数的二进制位进行操作。常用的位运算符包括与(&)、或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)。
-
与(&):对两个操作数的每一个位执行逻辑与操作,如果两个对应位都为1,则结果为1,否则为0。
-
或(|):对两个操作数的每一个位执行逻辑或操作,如果两个对应位任一为1,则结果为1,否则为0。
-
异或(^):对两个操作数的每一个位执行异或操作,如果两个对应位不相同,则结果为1,否则为0。
-
取反(~):对操作数的每一个位执行取反操作,即将0变为1,将1变为0。
-
左移(<<):将一个数的各二进制位全部左移若干位,高位丢弃,低位补0。
-
右移(>>):将一个数的各二进制位全部右移若干位,对无符号数,高位补0;对有符号数,采用符号位的扩展。
代码示例:
#include <stdio.h>int main()
{unsigned int a = 60; // 二进制表示为 0011 1100unsigned int b = 13; // 二进制表示为 0000 1101int result;result = a & b; // 二进制 0011 1100 & 0000 1101 = 0000 1100, 十进制为 12printf("a & b 的结果为 %d\n", result);result = a | b; // 二进制 0011 1100 | 0000 1101 = 0011 1101, 十进制为 61printf("a | b 的结果为 %d\n", result);result = a ^ b; // 二进制 0011 1100 ^ 0000 1101 = 0011 0001, 十进制为 49printf("a ^ b 的结果为 %d\n", result);result = ~a; // 二进制 ~0011 1100 = 1100 0011, 十进制为 -61printf("~a 的结果为 %d\n", result);result = a << 2; // 二进制 0011 1100 左移 2 位得到 1111 0000, 十进制为 240printf("a << 2 的结果为 %d\n", result);result = a >> 2; // 二进制 0011 1100 右移 2 位得到 0000 1111, 十进制为 15printf("a >> 2 的结果为 %d\n", result);return 0;
}
假设变量 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 |
5. 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
6. 杂项运算符 ↦ sizeof & 三元
6.1 sizeof()
sizeof()是一个在 C 语言中非常有用的运算符,用于计算数据类型或变量在内存中所占的字节数。它的一般形式是 sizeof(类型名) 或 sizeof(表达式) 。
例如,使用 sizeof 运算符可以获取特定数据类型的大小,比如:
int size = sizeof(int);
这将返回int 类型在当前系统中所占的字节数。另外也可以通过 sizeof运算符来获取变量或数组的大小,例如:
int array[5];
int size = sizeof(array);
这将返回整个数组array所占的字节数。
6.2 &取地址运算符
在C语言中,&是一个运算符,称为取地址运算符。它用于获取变量的地址。
当在变量前使用&运算符时,它会返回该变量在内存中的地址。例如:
int num = 10;
int *ptr = #
在这个例子中,&num返回变量num的地址,并将其赋值给指针变量ptr。ptr将指向num的位置。
&运算符通常与指针一起使用,用于传递变量的地址或进行内存操作。
6.3 *
在C语言中,*符号有多种含义,取决于它的上下文。
-
乘法运算符:在算术运算中,*是乘法运算符。例如int result = 2*3,这将把 2 和 3 相乘,并将结果赋给变量result。
-
指针声明符号:在声明指针变量时,*是用来声明一个指针变量的符号。例如
int
*ptr;
,这将声明一个名为ptr
的指向整数的指针变量。 -
间接访问运算符:当
*
用在指针变量前面时,它表示间接访问或解引用运算符,用于访问指针所指向的值。例如int value =
*ptr;
,这将获取指针ptr
所指向的值,并将其赋给value
。 -
乘法赋值运算符:*也可以与等号结合使用,形成乘法赋值运算符 *=。例如x*=2
;
,这等同于x = x
*2;
,将x
乘以 2 并将结果赋给x
。 -
在声明函数时,
*
可以用作指针返回类型的一部分。例如int* func();
,这表示函数func
返回一个指向int
类型的指针。
6.4 三目运算符
也叫条件运算符,格式为:表达式1 ? 表达式2 : 表达式3
。
它的作用是根据表达式1的结果,选择执行表达式2或表达式3,并返回相应的值。如果表达式1的结果为真,则执行表达式2并返回它的值;如果表达式1的结果为假,则执行表达式3并返回它的值。
下面是一个简单的示例,演示了三目运算符的使用:
int a = 5, b = 10;int max = (a > b) ? a : b;printf("最大值是:%d\n", max);
在这个示例中,我们使用三目运算符判断a和b哪个更大,并将结果赋给了变量max,最后输出了max的值。
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
& | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
* | 指向一个变量。 | *a; 将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
#include <stdio.h>int main()
{int a = 4;short b;double c;int* ptr;/* sizeof 运算符实例 */printf("Line 1 - 变量 a 的大小 = %lu\n", sizeof(a) );printf("Line 2 - 变量 b 的大小 = %lu\n", sizeof(b) );printf("Line 3 - 变量 c 的大小 = %lu\n", sizeof(c) );/* & 和 * 运算符实例 */ptr = &a; /* 'ptr' 现在包含 'a' 的地址 */printf("a 的值是 %d\n", a);printf("*ptr 是 %d\n", *ptr);/* 三元运算符实例 */a = 10;b = (a == 1) ? 20: 30;printf( "b 的值是 %d\n", b );b = (a == 10) ? 20: 30;printf( "b 的值是 %d\n", b );
}
7. 运算符优先级
类别 | 运算符 | 结合性 |
---|---|---|
后缀 | () [] -> . ++ - - | 从左到右 |
一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
乘除 | * / % | 从左到右 |
加减 | + - | 从左到右 |
移位 | << >> | 从左到右 |
关系 | < <= > >= | 从左到右 |
相等 | == != | 从左到右 |
位与 AND | & | 从左到右 |
位异或 XOR | ^ | 从左到右 |
位或 OR | | | 从左到右 |
逻辑与 AND | && | 从左到右 |
逻辑或 OR | || | 从左到右 |
条件 | ?: | 从右到左 |
赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
逗号 | , | 从左到右 |
C 变量-CSDN博客
C数据类型-CSDN博客
C语言_时光の尘的博客-CSDN博客