二话不说先看运算符的优先级表:
一、逗号运算符
- 格式:
- 整个逗号表达式的值
- 返回的结果是最后一个表达式的值
- 使用起来,最好加上括号来返回最后一个表达式的值。否则逗号表达式的意义将失效(见下面演示案例)
(表达式1, 表达式2, 表达式3....);
#include <stdio.h>
int main() {
int i = 0;
i = 1, 2, 3, 4, 5;
return 0;
}
这段代码,你认为i的值应该是多少?0,1还是5?如果不明白,你往前面五行文字看。
二、%运算符的作用
- %运算符有一个作用,可以用来取一个范围内的数字,类似于随机数
原理:
- 案例:0%3=0、1%3=1、2%3=2、3%3=0、4%3=1......
- 由上可以得出:n%m。无论一个多大的数对m取余,得到的结果范围在[0---m-1]之间( n%m ==>范围[0---m-1]。)
C语言随机数函数
- int a=rand()%10; //产生0~9之间的随机数,就是上面的原理
三、*运算符的注意事项
- 在C语言中,要尽量少用*,特别是在硬件开发中
- 因为对于*来说,CPU可能要运行多个周期,甚至还要利用软件的模拟方法来实现乘法。而+、-等运算符,CPU只需要一个周期
四、++,-- 自增自减运算符
这里区别于指针的++和--, --(++)变量 表示变量先-1(+1),再返回表达式的值。若运算符在变量后则表示先使用变量,然后变量-1(+1)。
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
printf("a++: %d\n", a++);
printf("++a: %d\n", ++a);
printf("a--: %d\n", a--);
printf("--a: %d\n", --a);
a = 0,b = 0;
printf(" %d %d %d \n",(b++)+a, a++);
printf("a:%d, b:%d\n", a,b);
return 0;
}
运行结果:
a++: 1
++a: 3
a--: 3
--a: 1
1 0 1
a:1, b:1
分析:第七行:先返回a的值,然后再进行a=a+1运算 因此输出1,a的值已经变成2了,
第八行:先进行a=a+1赋值,所以得到a的值是3,此时将结果返回,所以打印输出3,
那么第10,11行同理。
第14行呢,我之前说过printf的顺序,从坐往右依次分别计算(b++)+a, 然后是a++,所以先看前面的表达式,b++在括号里运算符优先级较高,因此b++相当于是先返回b的结果0,然后再b=b+1,此时b已经变成1了, 那么(b++)+a之后就是1, 再看后边的表达式,a++,相当于返回a的值0再给a+1,此时a的值变成1了,所以15行打印的a和b的值都是1。
五、|| && 条件判断运算符
&&,表示两边的条件都成立才返回真,什么意思呢,比如有个A&&B,实际上程序是先走A,如果A成功了再执行B, 如果A返回假,那么B就不会再执行了。
||,表示两边有一个条件成立就行, 比如 A||B 实际上程序是先走A,判断为真了,就不执行B了,如果A为假才会执行B。
!,表示相反,不解释了。
不要嫌弃高司机的话多,这里我给你一段代码,检查下自己是否已经掌握了:
#include <stdio.h>
int main()
{
int a = 1;
int b = 1;
if( a++ > 1|| ++b >= 1)
{
puts("test 1");
}
printf(" a:%d b:%d\n",a, b);
a = b = 1;
if( ++a > 1 && ++b > 1 )
{
puts("test 2");
}
printf(" a:%d b:%d\n",a, b);
a = b = 1;
if( ++a > 2 && ++b > 1 )
{
puts("test 3");
}
printf(" a:%d b:%d\n",a, b);
return 0;
}
运行结果:
test 1
a:2 b:2
test 2
a:2 b:2
a:2 b:1
六、sizeof 运算符
有人听到sizeof是运算符可能会大吃一惊,实际上在我开始学习C的时候,误认为sizeof是个函数。
那么sizeof怎么用,你可以 sizeof(变量名) ,sizeof(类型),sizeof 类型
#include <stdio.h>
int main()
{
int a = 12;
float b=12.0;
printf(" a:%d b:%d\n", sizeof a, sizeof b);
printf(" NULL:%d\n", sizeof NULL);
return 0;
}
你算下结果是不是和你想的一样,如果不一样,为什么呢,如果有不明白的可以在留言板或者聊天频道给我留言哈。高司机对粉丝是很有耐心的。
关于sizeof的更多用法,我将会在指针以及结构体部分渗入,你会感受到sizeof的无限乐趣。
七、位运算符
按位与:&
- 功能:对每一个比特位进行“与”运算
- 演示案例:
#include <stdio.h>
int main()
{
int a = 8;
int b = 5;
printf("%d\n", a & b);
return 0;
}
- 图示解析如下:
按位或:|
- 功能:对每一个比特位进行“或”运算
- 演示案例:
#include <stdio.h>
int main()
{
int a = 8;
int b = 5;
printf("%d\n", a | b);
return 0;
}
按位异或:^
- 功能:对每一个比特位进行比较,相同为0,不同为1
- 演示案例:
#include <stdio.h>
int main()
{
int a = 8;
int b = 5;
printf("%d\n", a ^ b);
return 0;
}
左移::<<
- 功能:对一个数字进行左移,相当于对乘以“2的n次方”
- 演示案例:
#include <stdio.h>
int main()
{
int a = 8;
// 相当于8*(2的2次方) = 8*4 =32
printf("%d\n", a << 2);
return 0;
}
说到这里,如果你有一些复杂运算,是不断乘以或除以2,那么你其实可以考虑使用位运算更快捷。
右移::>>
- 功能:对一个数字进行左移,相当于对除以“2的n次方”
- 演示案例:
#include <stdio.h>
int main()
{
int a = 32;
// 相当于32/(2的2次方) = 32/4 =8
printf("%d\n", a >> 2);
return 0;
}