🐌博主主页:🐌倔强的大蜗牛🐌
📚专栏分类:C
❤️感谢大家点赞👍收藏⭐评论✍️
目录
今天开始来介绍各种操作符
1.操作符分类
算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员
2.算术操作符
+ - * / %
注意点:
- “/” 操作符如果两个操作数都为整数,执行整数除法
-
“/” 操作符只要有浮点数执行的就是浮点数除法
-
% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
- 还有(5/0)这种形式是错误的vs里会出现C2124的错误(被零除或对零求模。常量表达式的分母为零。 若要解决此错误,请勿将零作为除数。)
3.移位操作符
<< 左移操作符>> 右移操作符注:移位操作符的操作数只能是整数。
在讲解移位运算符之前,先大概的讲解一下原码、反码、补码的必备知识点
- 正数的原码、反码、补码都是一样的
- 最前面的1/0是符号位,1(负数)和0(正数)
该怎么计算呢?
接下来开始正式讲解移位操作符
1左移操作符
- 先将数转换成二进制,然后向左移n位(左移后右边就缺少了,所以在右边加0,补上空缺)
- 左移无论是正数和负数都遵循一个公式
2右移操作符
1.先将数转换成二进制,然后向右移n位
右移:
算术右移(右边丢弃,左边补原来的符号位)逻辑右移 (右边丢弃,左边直接补0)
C语言没有明确规定倒是算术右移还是逻辑右移,一般编译器上采用的是算术右移
警告:对于移位运算符,不要移动负数位,这个标准还未定义的;
4.位操作符
&---------- 按位与| ---------- 按位或^ ---------- 按位异或(支持交换律)注:他们的操作数必须是整数。
a^a=0
0^a=a
//这种代码可读性不高,效率也不高
a = a^b;
b = a^b;
a = a^b;
//代码可读性高,效率也高
temp=a;
a=b;
b=temp;
5.赋值操作符
a = x = y + 1 ; // 连续赋值
这种代码的可读性不高
复合赋值符
+=-=*=/=%=>>=<<=&=|=^=
6.单目操作符
! 逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置 --++ 前置、后置 ++* 间接访问操作符 ( 解引用操作符 )( 类型 ) 强制类型转换
一个重要的点:
sizeof是操作符不是函数
printf ( "%d\n" , sizeof arr );// arr的括号可以去掉,这就可以说明sizeof不是函数printf ( "%d\n" , sizeof ( int )); //但是sizeof如果要计算的是类型的大小,那这个括号就不能去掉,否则就会报错
++和--运算符
-
前置++和--
//前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;//先++,然后再用a=11,x=11;
int y = --a;//先--,然后再用a=10,y=10;
return 0;
}
//后置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;//先用a,再增加,x=10;之后a变成11;
int y = a--;//先用a,再自减,y=11;之后a变成10;
return 0;
}
7.关系操作符
>>=<<=!= 用于测试 “ 不相等 ”== 用于测试 “ 相等 ”
警告:
在编程的过程中
==
和
=
不小心写错,会导致的错误的欧
8.逻辑操作符
&& 逻辑与|| 逻辑或
9.条件操作符 (三目操作符)
exp1 ? exp2 : exp3
例子:a=1;b=3;
a>b?a:b;(答案是3)
10.逗号表达式
- 逗号表达式,就是用逗号隔开的多个表达式。
- 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
11.下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名
+
一个索引值
2. ( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3. 访问一个结构的成员
.
结构体
.
成员名
->
结构体指针
->
成员名
12.表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。
算术转换
- 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
- 如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
操作符的属性
两个相邻的操作符先执行顺序取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
优先级高的先算,低的后算
还有一点要重点看:
int main()
{
int i = 10;
i = i-- - --i * ( i = -3 ) * i++ + ++i;
printf("i = %d\n", i);
return 0;
}
这种代码就是垃圾代码,无法确定唯一的计算路径
在不同编译器中测试结果:非法表达式程序的结果
值 | 编译器 |
—128 |
Tandy 6000 Xenix 3.2
|
—95
| Think C 5.02(Macintosh) |
—86
| IBM PowerPC AIX 3.2.5 |
—85
| Sun Sparc cc(K&C编译器) |
—63
| gcc,HP_UX 9.0,Power C 2.0.0 |
4
| Sun Sparc acc(K&C编译器) |
21
| Turbo C/C++ 4.5 |
22
| FreeBSD 2.1 R |
30
| Dec Alpha OSF1 2.0 |
36
| Dec VAX/VMS |
42
| Microsoft C 5.1 |
总结:如果表达式不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题
的。
❤️结语:
本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!