文章目录
一、 算数操作符
操作符 | 解释 | 说明 |
---|---|---|
+ | 加法操作符 | a+b=c |
- | 减法操作符 | a-b=c |
* | 乘法操作符 | a*b=c |
/ | 除法操作符 | a/b=c |
% | 取余操作符 | a%b=c,取余操作符的左右都必须是整型 |
二、移位运算符
位操作符包括右移和左移。只能作用于整数。
右移操作符包括算术右移和逻辑右移
1、算术右移为:右边丢弃,左边补原符号位
2、逻辑右移为:右边丢弃,左边补0
左移为左边丢弃,右边补0
操作符 | 解释 | 说明 |
---|---|---|
>> | 右移操作符 | 移动的是二进制位。a >> 1,右移一位相当于除以2 |
<< | 左移操作符 | 移动的是二进制位。a << 1,左移一位相当于乘以2 |
注意:对于移位运算符,不要移动负数位,这个是标准未定义的。例如:
int num=10;
num >> -1; // 错误
三、位操作符
操作符 | 解释 | 说明 |
---|---|---|
& | 按位与 | 按二进制位运算,同为1则为1,反之为0 |
| | 按位或 | 按二进制位运算,有1则为1,同为0则为0 |
^ | 按位异或 | 按二进制位运算,对应位相同为0,相异为1 |
注意:它们的操作数必须是整数
& 运算示例:
#include <stdio.h>
int main(){
int a = 3; // 00000000000000000000000000000011为3的二进制形式
int b = 5; // 00000000000000000000000000000101为5的二进制形式
int c = a&b; //&运算后的c为:00000000000000000000000000000001 结果为1
printf("%d", c); // 结果为1
return 0;
}
| 运算示例:
#include <stdio.h>
int main(){
int a = 3; // 00000000000000000000000000000011为3的二进制形式
int b = 5; // 00000000000000000000000000000101为5的二进制形式
int c = a|b; //|运算后的c为:00000000000000000000000000000111 结果为7
printf("%d", c); // 结果为7
return 0;
}
^ 运算符示例:
#include <stdio.h>
int main(){
int a = 3; // 00000000000000000000000000000011为3的二进制形式
int b = 5; // 00000000000000000000000000000101为5的二进制形式
int c = a^b; //^运算后的c为:00000000000000000000000000000110 结果为6
printf("%d", c); // 结果为6
return 0;
}
3.1 交换变量的值
在不借助第三个变量的情况下,交换两个变量的值
#include <stdio.h>
int main(){
int a = 3; // 00000000000000000000000000000011为3的二进制形式
int b = 5; // 00000000000000000000000000000101为5的二进制形式
printf("交换前:a=%d, b=%d\n", a, b);
// a^b的结果为:00000000000000000000000000000110 十进制为:6,此时a等于6。
a = a^b;
// 此时a等于6,二进制为:00000000000000000000000000000110
// b等于5,二进制为:00000000000000000000000000000101
// 再次与b异或的结果为:00000000000000000000000000000011 十进制为:3
// 将结果赋值给b,此时b的结果为3
b = a^b;
// 此时a等于6,二进制为:00000000000000000000000000000110
// b等于3,二进制为:00000000000000000000000000000011
// 再次异或的结果为:00000000000000000000000000000101 十进制为:5
// 将结果赋值给a,完成a与b的交换
a = a^b;
printf("交换后:a=%d, b=%d", a, b); // 结果a为5,b为3
return 0;
}
四、赋值操作符
赋值操作符其实就是一个等号 “=”,在程序中一个等号代表赋值操作符,而两个等号 “==”则表示等号。
操作符 | 解释 | 说明 |
---|---|---|
= | 赋值运算 | 表示右边的值赋给左边,而不是左边的值等于右边的值 |
int a = 3; //表示将3赋值给a,此时a的值就是3
五、复合操作符
操作符 | 解释 | 说明 |
---|---|---|
+= | 加等于 | 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 |
六、单目操作符
6.1 操作符介绍
操作符 | 解释 | 说明 |
---|---|---|
! | 逻辑反 | 真变成假,假变成真。如果a为真,则 !a为假 |
- | 负值 | -1,-3等 |
+ | 正值 | +1, +3等 |
& | 取地址 | &a表示取出a变量的地址 |
sizeof | 操作数的类型长度 | 以字节为单位 |
~ | 对一个数的二进制按位取反 | 看示例 |
- - | 自减 | 前置、后置- - |
++ | 自加 | 前置、后置++ |
* | 间接访问操作符(解引用操作符) | 看示例 |
(类型) | 强制类型转换 | (int)float_num |
6.2 操作符示例
6.2.1 * 解引用操作符的示例
#include <stdio.h>
int main(){
int a = 10;
int* p = &a; //将a的地址赋值给指针变量p
*p = 20; // *为解引用操作符。表示通过p找到a
printf("a的值为:%d", a); //a的值为20
return 0;
}
6.2.2 ~ 取反操作符示例
#include <stdio.h>
int main(){
int a = 0;
// a的二进制为:00000000000000000000000000000000
// 11111111111111111111111111111111 为a的补码
// 11111111111111111111111111111110 反码
// 10000000000000000000000000000001 源码值为-1
printf("a的值为:%d", ~a); //a的值为-1
return 0;
}
6.2.3 自加自减
分类:
前自增 -- ++i
后自增 -- i++
相同点:最终都使 i 的值加1
不同点:前自增整体表达式的值是 i 加1之后的值。后自增整体表达式的值是 i 加1之前的值。
前- -同理
6.2.3.1 前++使用示例
#include <stdio.h>
int main(){
int a = 10;
// ++放在前面,先++,后使用
printf("a的值为:%d", ++a); //a的值为11
return 0;
}
6.2.3.2 后++使用示例
后- -同理
#include <stdio.h>
int main(){
int a = 10;
// ++放在后面,先使用,再++
printf("a的值为:%d", a++); //a的值为10
return 0;
}
6.2.3.3 综合使用示例
#include <stdio.h>
int main(void)
{
int i, j, k, m;
i = j = 3;
k = ++i;
m = j++;
printf("i = %d j = %d k = %d m = %d", i, j, k, m);
return 0;
}
i = 4 j = 4 k = 4 m = 3
6.2.4 强制类型转换
语法:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型
6.2.4.1 强制类型转换示例
#include <stdio.h>
int main(){
// 3.14为double类型,赋值给int的a精度丢失,且报警告
// 使用(int)3.14可以将3.14强制转换成int类型
int a = (int)3.14;
printf("%d", a); // a的值为3
return 0;
}
七、关系操作符
操作符 | 解释 | 说明 |
---|---|---|
> | 大于 | a > b |
>= | 大于等于 | a >= b |
< | 小于 | a < b |
<= | 小于等于 | a <= b |
!= | 不等于 | a != b |
== | 等于 | a == b |
八、逻辑操作符
操作符 | 解释 | 说明 |
---|---|---|
&& | 逻辑与 | 同为真则为真,有一个为零则为假。当计算出左边为假时,右边不再运算 |
|| | 逻辑或 | 同为假则为假,有一个为真则为真。当计算出左边为真时,右边不在运算 |
8.1 逻辑与示例
#include <stdio.h>
int main(){
int a = 3; // a为非零,则为真
int b = 2; // b为非零,则为真
int c = a && b; // a && b 则同为真则为真,反之为零。
printf("%d", c); // 结果为:1
return 0;
}
8.2 逻辑或示例
#include <stdio.h>
int main(){
int a = 3; // a为非零,则为真
int b = 0; // b为零,则为假
int c = a || b; // a || b 则同为假则为假,有一个为真则为真。
printf("%d", c); // 结果为:1
return 0;
}
8.3 面试题示例
#include <stdio.h>
int main(){
int i=0, a = 0, b = 2, c = 3, d = 4;
// 运算a++时,为先赋值再运算,则a等于0。
// 当a等于0时,后面不管什么整个表达式都为假,后面不再运算。
// 然后a再自加1
i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=1, b=2, c=3, d=4
return 0;
}
#include <stdio.h>
int main(){
int i=0, a = 1, b = 2, c = 3, d = 4;
// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=2, b=2, c=3, d=4
return 0;
}
九、条件操作符(三目运算符)
操作符 | 解释 | 说明 |
---|---|---|
exp1 ? exp2 ? :exp3 | 条件操作符 | 如果exp1为真,则exp2为整个表达式的结果。如果exp1的结果为假,则exp3为整个表达式的结果 |
9.1 条件操作符示例
#include <stdio.h>
int main(){
int i = 0, a = 4, b = 3;
// 当a大于b时,输出a,反之输出b
// 相当于:
// if(a > b){
// i = a;
// }else{
// i = b;
// }
i = a > b ? a : b;
printf("i=%d", i); // 结果为i=4
return 0;
}
十、逗号表达式
表达式 | 说明 |
---|---|
exp1, exp2, exp3, … expN | 逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果 |
10.1 逗号表达式示例
#include <stdio.h>
int main(){
int i=0, a = 1, b = 2, c = 3, d = 4;
// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
printf("i=%d", i); // 结果i=13
return 0;
}
十一、结构体成员操作符
操作符 | 解释 | 说明 |
---|---|---|
. | 结构体成员操作符 | 结构体 . 成员名 |
-> | 结构体指针操作符 | 结构体指针->成员名 |
11.1 结构体成员操作符示例
#include <stdio.h>
// 结构体
struct Student
{
char name[20];
int age;
char gender[8];
};
int main(){
// 创建结构体对象
struct Student s1 = {
"张三", 12, "男"};
// 打印其中结构体对象中属性的值
//s1.gender为取到结构体对象中gender的值
// 结构体对象.成员名
printf("%s", s1.gender); // 结果为:男
return 0;
}
11.2 结构体指针操作符示例
#include <stdio.h>
// 结构体
struct Student
{
char name[20];
int age;
char gender[8];
};
int main(){
// 创建结构体对象
struct Student s1 = {
"张三", 12, "男"};
// 将s1的地址赋值给ps,因为指针变量可以接收地址
// 所以ps的类型为Student的指针类型,
struct Student* ps = &s1;
// -> 操作符可以使指针指向对象的成员属性
printf("%s", ps->name); // 结果为:张三
return 0;
}
十二、转义字符
转义字符,所有的ASCII码都可以用 “ \ ” 加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 “” 来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。
// \ddd表示1到3位的八进制所代表的任意字符 示例
#include <stdio.h>
int main() {
// '\46'在ASCII表中代表的时&,所以输出的结果为:&
printf("%c\n", '\46'); // 输出结果为:&
// '\044'在ASCII表中代表的时&,所以输出的结果为:$
printf("%c\n", '\044'); // 输出结果为:$
return 0;
}
// \xhh表示十六进制所代表的任意字符 示例
#include <stdio.h>
int main() {
// '\x25'在ASCII表中代表的时%,所以输出的结果为:%
printf("%c\n", '\x25'); // 输出结果为:%
return 0;
}
注意:
- 区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换。
- \xhh 十六进制转义不限制字符个数 ‘\x000000000000F’ == ‘\xF’ 。
- "\n"表示两个字符占用一个字节。其他类似
文章评论