每天进步一点点,坚持带来大改变!!!
前言:
接下来就开始对C语言中涉及的所有操作符进行一个详细的介绍,熟悉掌握并灵活使用。
目录
前言:
1.算数操作符:
2.移位操作符
1.左移操作符:
1.移动整数的二进制位
2.右移操作符
3.位操作符
1.按位与:
2.按位或:
3.按位异或 :
练习1:
4.赋值操作符:
5.单目操作符:
6.关系操作符
7.逻辑操作符:
练习:
8.条件操作符:
9.逗号表达式:
10.下标引用,函数调用和结构成员
11.表达式求值 :
1.算数操作符:
包括:+ - * / %
包括:+ - * / %
注意:
1.%:两边必须是整数
2./:两边是整数执行整数除法,两边任意一个是浮点数执行浮点数除法。
2.移位操作符
<<:左移操作符
>>:右移操作符
1.左移操作符:
1.移动整数的二进制位
<<:左移操作符
>>:右移操作符
1.移动整数的二进制位
整数的二进制位:
正数的二进制:
原码,反码,补码相同
负数的二进制:
原码,反码=符号位不变,其它位按位取反,补码=反码加1
符号位:最高位0表示正数,最高位1表示负数
规则:
左边丢弃,右边补0:
1.正数左移一位:
解释:
2.负数左移一位
解释:
特点:具有*2倍的效果
2.右移操作符
算术右移:左边用该值的原符号位补充,右边丢弃
逻辑右移:左边用0补充,右边丢弃
正数右移:
解释:
负数右移:
解释:
补的是原符号位,说明右移的规则是按照算数右移进行的
算术右移:左边用该值的原符号位补充,右边丢弃
逻辑右移:左边用0补充,右边丢弃
正数右移:
解释:
负数右移:
解释:
补的是原符号位,说明右移的规则是按照算数右移进行的
注意:移位操作符移的必须是正整数位。
3.位操作符
&:按位与
|: 按位或
^: 按位异或
&:按位与
|: 按位或
^: 按位异或
规则:按照二进制位(补码)操作
注意:操作数必须是整数
1.按位与:
正数按位与:
规则:相同则为1,相异则为0
负数按位与:
2.按位或:
1.正数按位或:
规则:有一个为1,则为1.
2.负数按位或:
3.按位异或 :
1.正数按位异或:
规则:相同则为0,相异则为1
2.负数的按位异或:
练习1:
题目描述:不创建临时变量,实现两个整数的交换
解释:
4.赋值操作符:
=,+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
其它符合运算符也一样
……
5.单目操作符:
! 逻辑反操作
解释:!代表取反,如果条件为真,!条件则为假
C语言中0表示假,非0表示真
- 负值
+ 正值
& 取地址
&:取出变量在内存中的存储地址
sizeof 操作数的类型长度(以字节为单位)
sizeof:
计算变量所占内存空间的大小,单位是字节
计算的是类型所创建变量所占空间的大小,单位是字节
~ 对一个数的二进制位(所有位)按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型)强制类型转换
(int):将一个浮点数强制转化为整型类型的
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
正数按位与:
规则:相同则为1,相异则为0
负数按位与:
1.正数按位或:
规则:有一个为1,则为1.
2.负数按位或:
3.按位异或 :
1.正数按位异或:
规则:相同则为0,相异则为1
2.负数的按位异或:
练习1:
题目描述:不创建临时变量,实现两个整数的交换
解释:
4.赋值操作符:
=,+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
其它符合运算符也一样
……
5.单目操作符:
! 逻辑反操作
解释:!代表取反,如果条件为真,!条件则为假
C语言中0表示假,非0表示真
- 负值
+ 正值
& 取地址
&:取出变量在内存中的存储地址
sizeof 操作数的类型长度(以字节为单位)
sizeof:
计算变量所占内存空间的大小,单位是字节
计算的是类型所创建变量所占空间的大小,单位是字节
~ 对一个数的二进制位(所有位)按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型)强制类型转换
(int):将一个浮点数强制转化为整型类型的
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
1.正数按位异或:
规则:相同则为0,相异则为1
2.负数的按位异或:
题目描述:不创建临时变量,实现两个整数的交换
解释:
4.赋值操作符:
=,+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
其它符合运算符也一样
……
5.单目操作符:
! 逻辑反操作
解释:!代表取反,如果条件为真,!条件则为假
C语言中0表示假,非0表示真
- 负值
+ 正值
& 取地址
&:取出变量在内存中的存储地址
sizeof 操作数的类型长度(以字节为单位)
sizeof:
计算变量所占内存空间的大小,单位是字节
计算的是类型所创建变量所占空间的大小,单位是字节
~ 对一个数的二进制位(所有位)按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型)强制类型转换
(int):将一个浮点数强制转化为整型类型的
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
=,+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=
其它符合运算符也一样
……
! 逻辑反操作
解释:!代表取反,如果条件为真,!条件则为假
C语言中0表示假,非0表示真
- 负值
+ 正值
& 取地址&:取出变量在内存中的存储地址
sizeof 操作数的类型长度(以字节为单位)sizeof:
计算变量所占内存空间的大小,单位是字节
计算的是类型所创建变量所占空间的大小,单位是字节
~ 对一个数的二进制位(所有位)按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型)强制类型转换
(int):将一个浮点数强制转化为整型类型的
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意:==:判断相等 =:赋值
7.逻辑操作符:
&&:逻辑与 两个为真则为真
I I: 逻辑或 有一个为真则为真
练习:
#include
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %dn b = %dn c = %dnd = %dn", a, b, c, d);
return 0;
}
//程序输出的结果是什么?
#include
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++||++b||d++;
printf("a = %dnb = %dnc = %dnd = %dn", a, b, c, d);
return 0;
}
程序输出的结果是什么??
8.条件操作符:
exp1 ? exp2 : exp3
求较大值:
9.逗号表达式:
exp1, exp2, exp3, …expN
规则:执行最后一个表达式的结果:
10.下标引用,函数调用和结构成员
1. [ ] :下标引用操作符,用来访问数组的元素
[ ]:有两个操作数,一个是数组名,一个是下标:
注:操作数满足交换律:
2.():函数调用操作符
注:函数调用操作符至少包含一个操作数(函数名)
3.访问一个结构体成员:
.:结构体对象.成员名
—>:结构体指针—>成员名
注:(*ps).age 等价于 ps—>age
11.表达式求值 :
&&:逻辑与 两个为真则为真
I I: 逻辑或 有一个为真则为真
#includeint main() { int i = 0,a=0,b=2,c =3,d=4; i = a++ && ++b && d++; //i = a++||++b||d++; printf("a = %dn b = %dn c = %dnd = %dn", a, b, c, d); return 0; } //程序输出的结果是什么? #includeint main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++||++b||d++; printf("a = %dnb = %dnc = %dnd = %dn", a, b, c, d); return 0; } 程序输出的结果是什么??
8.条件操作符:
exp1 ? exp2 : exp3
求较大值:
9.逗号表达式:
exp1, exp2, exp3, …expN
规则:执行最后一个表达式的结果:
10.下标引用,函数调用和结构成员
1. [ ] :下标引用操作符,用来访问数组的元素
[ ]:有两个操作数,一个是数组名,一个是下标:
注:操作数满足交换律:
2.():函数调用操作符
注:函数调用操作符至少包含一个操作数(函数名)
3.访问一个结构体成员:
.:结构体对象.成员名
—>:结构体指针—>成员名
注:(*ps).age 等价于 ps—>age
11.表达式求值 :
exp1 ? exp2 : exp3
求较大值:
exp1, exp2, exp3, …expN
规则:执行最后一个表达式的结果:
10.下标引用,函数调用和结构成员
1. [ ] :下标引用操作符,用来访问数组的元素
[ ]:有两个操作数,一个是数组名,一个是下标:
注:操作数满足交换律:
2.():函数调用操作符
注:函数调用操作符至少包含一个操作数(函数名)
3.访问一个结构体成员:
.:结构体对象.成员名
—>:结构体指针—>成员名
注:(*ps).age 等价于 ps—>age
11.表达式求值 :
1. [ ] :下标引用操作符,用来访问数组的元素
[ ]:有两个操作数,一个是数组名,一个是下标:
注:操作数满足交换律:
2.():函数调用操作符
注:函数调用操作符至少包含一个操作数(函数名)
3.访问一个结构体成员:
.:结构体对象.成员名
—>:结构体指针—>成员名
注:(*ps).age 等价于 ps—>age
1.表达式的求值顺序与操作符的优先级和结合性有关
2.有些表达式求值的时候需要转换为其它类型:
隐式类型转换(整形提升):计算机在计算字符型和短整型的时候会转换为普通整形
整形提升的规则:
有符号类型的数字整形提升拿最高位补充符号位
无符号类型的数字整形提升的时候拿0补充符号位
例1:
例2:
解释:a,b是字符型和短整型,所以计算的时候发生了整形提升
解释:我们将有符号类型的char和short改为 无符号类型的高位拿0补充符号位,所以虽然进行了整形提升,但是数值并没有发生变化。



