目录
1.操作符分类
2.算术操作符
3.位移操作符
3.1左移操作符
3.2右移操作符
4.位操作符
4.1’&‘(按位与)
4.2’|‘(按位或)
4.3‘^’(按位异或)
5.赋值操作符
5.1复合赋值符
6.单目操作符
6.1'!'(逻辑反操作)
6.2‘+’与‘-’(正负值)
6.3‘&’与‘*’(取地址与解引用)
6.4sizeof
6.5‘~’(二进制位取反)
6.6前后置‘++’与‘--’
6.7(类型)强制类型转换
7.关系操作符
8.逻辑操作符
9.条件操作符
10.逗号表达式
11.下标引用、函数调用和结构成员的相应操作符
11.1下标引用操作符
11.2函数调用操作符
11.3访问结构体成员运用到的操作符
1.操作符分类
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
2.算术操作符
+ - * / %
除了‘%’,其他操作符均可以作用于整数与浮点数。
‘/’如果两边的操作数均为整数,则结果为整数,有浮点数操作数则结果为浮点数。
‘%’两边的操作数均要为整数
3.位移操作符
<< 左移操作符
>> 右移操作符
位移操作符只能作用于整数
3.1左移操作符
移位规则:左边抛弃,右边补0
int main()
{
int a = 2;
int b = 0;
b = a << 1;
printf("a=%d,b=%d\n", a, b);
return 0;
}
整数左移1位相当于乘以2.
当左移的整数为负数时,是对其补码进行左边抛弃右边补0。在打印的时候将左移后得到的新补码复原成原码进行打印。
负数:原码转化成补码(取反后+1)
补码转化成原码(取反后+1,或-1后取反)
3.2右移操作符
移位规则:1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
我们一般使用的右移是算术移位
int main()
{
int a = 10;
int b = 0;
b = a >> 1;
printf("a=%d,b=%d\n", a, b);
return 0;
}
4.位操作符
& //按位与
| //按位或
^ //按位异或
位操作符的操作数必须为整数。
4.1’&‘(按位与)
有0则为0,两1则为1。
int main()
{
int a = 10;
int b = 2;
int c = a & b;
printf("c=%d", c);
return 0;
}
4.2’|‘(按位或)
有1则为1,两0才为0
int main()
{
int a = 10;
int b = 2;
int c = a | b;
printf("c=%d", c);
return 0;
}
4.3‘^’(按位异或)
不同则为1,相同则为0
按位异或支持交换律:a^b^a == a^a^b
且a^0 = a
int main()
{
int a = 10;
int b = 2;
int c = a ^ b;
printf("c=%d", c);
return 0;
}
按位异或的简单应用:(1条消息) [C语言]两个变量实现两个数互换_HY_PIGIE的博客-CSDN博客
5.赋值操作符
= //将值赋给变量
5.1复合赋值符
- +=
- -=
- *=
- /=
- %=
- >>=
- <<=
- &=
- |=
- ^=
int a = 5;
a += 1;等价于a = a+1;
其他操作符也是一样的道理
6.单目操作符
单目操作符即只运用到单个操作数上
即a = -a 与 a = a-1;中两个‘-’的含义是不同的。
第一个是单目操作符,把a的值变成负值。
第二个是算术操作符,减号的含义
!
-
+
&
sizeof
~
--
++
(类型)
*逻辑反操作
负值
正值
取地址
操作数的类型长度(以字节为单位)
对一个数的二进制按位取反
前置、后置--
前置、后置++
强制类型转换
间接访问操作符(解引用操作符)
6.1'!'(逻辑反操作)
在c语言中,0表示为假,非0表示为真。!能把假的变为真,真的变为假。
a = 0;
!a = 1;
6.2‘+’与‘-’(正负值)
‘+’与‘-’把数值相应的变成正数或负数
6.3‘&’与‘*’(取地址与解引用)
取地址:只要目标是一个变量,就可以取其地址。数组,结构体都有其地址
int a = 2;
int *pa = &a;//表示为取a的地址,即将a的地址存放到指针变量pa当中
解引用:通过地址找到相应的变量的值
int a = 5;
char ch = 'z';
int *pa = &a;
char *pch = &ch;
printf("pa=%p pch=%p\n", pa, pch);
printf("*pa=%d *pch=%c",*pa,*pch);
6.4sizeof
sizeof用来计算操作数的类型长度,以字节为单位,且其内部不进行任何运算。
int main()
{
int a = 0;
short b = 2;
printf("%d\n", sizeof(b = a + 2));
printf("%d", b);
return 0;
}
打印结果为:2
2
sizeof内部不进行运算,所以b的值没有变化
6.5‘~’(二进制位取反)
将一个整数的二进制位进行取反,不区分符号位统统进行取反处理
int main()
{
int a = 0;
printf("%d", ~a);
return 0;
}
整数0的二进制位:00000000 00000000 00000000 00000000
取反后:11111111 11111111 11111111 11111111,得到-1
6.6前后置‘++’与‘--’
此处使用‘++’举例,‘--’同理
前置‘++’,即++a,是先使a+1后再使用a+1
后置‘++’,即a++,是先使用a,使用完后再使a+1
int main()
{
int a = 5;
int b = a++;//后置++,先使用a再使a+1,所以此处b=a=5,a=a+1=6;
int c = ++a;//前置++,先使a+1再使用a+1,所以此处a=a+1=7,c=7;
printf("%d %d %d", a, b, c);//a=7,b=5,c=7;
return 0;
}
6.7(类型)强制类型转换
强制类型转换就是把变量从一种类型转换到另一种类型。
将浮点数3.14强制转换成int类型后可以存储到int型的变量a当中,a也只取到了3.14的整数部分
int main()
{
int a = (int)3.14;
printf("%d", a);
return 0;
}
7.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
8.逻辑操作符
&& //逻辑与
|| //逻辑或
值得注意的是,在逻辑与中:
当操作符左边为假时,右边则不进行计算
在逻辑或中:
当操作符左边为真时,右边则不进行计算
1.逻辑与eg:
int main()
{
int a = 0;
int b = 2;
int c = 3;
int d = 4;
int i = 0;
i = a++ && ++b && d++;//a++为后置++,先使用a的数值,在使a+1,在c语言中0代表为假
//在逻辑与左边为假时,判断结束,右边不进行计算。
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
当把a换成非0数时,结果就会大不相同。
2.逻辑或eg:
int main()
{
int a = 0;
int b = 2;
int c = 3;
int d = 4;
int i = 0;
i = a++ || ++b || d++;//逻辑或在左边为真时,右边不进行计算
//a++为后置++,先使用a的值,a=0,为假,后a=a+1;
//++b为前置++,先使b=b+1=3,非0数即为真,到此处逻辑或判断结束
//后面不进行计算
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
9.条件操作符
exp1 ? exp2 : exp3
先判断exp1的结果,如果exp1的结果为真则返回exp2
如果exp1的结果为假则返回exp3
int main()
{
int a = 5;
int b = 10;
int c = a > b ? a : b;//a>b为假,返回b的值
printf("两者中较大值为:%d", c);
return 0;
}
10.逗号表达式
exp1, exp2, exp3, …expN
用逗号隔开多个表达式,从左向右以此执行,以最后一个表达式的结果作为整个逗号表达式的结果
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//从左到右依次执行
printf("%d", c); //以最后的表达式为整个表达式的结果
return 0;
}
11.下标引用、函数调用和结构成员的相应操作符
11.1下标引用操作符
[ ] //引用下标
操作数为:数组名 + 索引值
int arr[4]={1,2,3,4};
printf("%d",arr[0]);//使用下标引用操作数,打印与索引值相同的下标对应存储的数值
11.2函数调用操作符
( ) //函数调用操作符
int cmp(int a, int b)//操作数为,函数名+相应参数
{
return a > b ? a : b;
}
int main()
{
int a = 2;
int b = 10;
int c=cmp(a, b);
printf("较大值为:%d", c);//()为函数调用的操作符
return 0;
}
11.3访问结构体成员运用到的操作符
. -> | 结构体.成员名 结构体指针->成员名 |
struct s
{
int age;
char name[10];
};
int main()
{
struct s people = { 10,"zhangsan" };
struct s* ps =&people;
printf("%d %s\n", ps->age, ps->name);
printf("%d %s", people.age, people.name);
return 0;
}