前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C:03---运算符优先级

C:03---运算符优先级

作者头像
用户3479834
发布2021-02-03 15:45:23
5050
发布2021-02-03 15:45:23
举报
文章被收录于专栏:游戏开发司机游戏开发司机

二话不说先看运算符的优先级表:

一、逗号运算符

  • 格式:
    • 整个逗号表达式的值
    • 返回的结果是最后一个表达式的值
    • 使用起来,最好加上括号来返回最后一个表达式的值。否则逗号表达式的意义将失效(见下面演示案例)

(表达式1, 表达式2, 表达式3....);

代码语言:javascript
复制
#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)。

代码语言:javascript
复制
#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;
}

运行结果:

代码语言:javascript
复制
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。

!,表示相反,不解释了。

不要嫌弃高司机的话多,这里我给你一段代码,检查下自己是否已经掌握了:

代码语言:javascript
复制
#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;
}

运行结果:

代码语言:javascript
复制
test 1
 a:2 b:2
test 2
 a:2 b:2
 a:2 b:1

六、sizeof 运算符

有人听到sizeof是运算符可能会大吃一惊,实际上在我开始学习C的时候,误认为sizeof是个函数。

那么sizeof怎么用,你可以 sizeof(变量名) ,sizeof(类型),sizeof 类型

代码语言:javascript
复制
#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的无限乐趣。

七、位运算符

按位与:&

  • 功能:对每一个比特位进行“与”运算
  • 演示案例:
代码语言:javascript
复制
#include <stdio.h>
int main()
{
int a = 8;
int b = 5;
printf("%d\n", a & b);
return 0;
}
  • 图示解析如下:

按位或:|

  • 功能:对每一个比特位进行“或”运算
  • 演示案例:
代码语言:javascript
复制
#include <stdio.h>
int main()
{
int a = 8;
int b = 5;
printf("%d\n", a | b);
return 0;
}

按位异或:^

  • 功能:对每一个比特位进行比较,相同为0,不同为1
  • 演示案例:
代码语言:javascript
复制
#include <stdio.h>

int main()
{
int a = 8;
int b = 5;
printf("%d\n", a ^ b);


return 0;
}

左移::<<

  • 功能:对一个数字进行左移,相当于对乘以“2的n次方”
  • 演示案例:
代码语言:javascript
复制
#include <stdio.h>

int main()
{
int a = 8;


// 相当于8*(2的2次方) = 8*4 =32
printf("%d\n", a << 2);


return 0;
}

说到这里,如果你有一些复杂运算,是不断乘以或除以2,那么你其实可以考虑使用位运算更快捷。

右移::>>

  • 功能:对一个数字进行左移,相当于对除以“2的n次方”
  • 演示案例:
代码语言:javascript
复制
#include <stdio.h>
int main()
{
int a = 32;
// 相当于32/(2的2次方) = 32/4 =8
printf("%d\n", a >> 2);
return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二话不说先看运算符的优先级表:
  • 一、逗号运算符
  • 二、%运算符的作用
    • 原理:
    • 三、*运算符的注意事项
    • 四、++,-- 自增自减运算符
    • 运行结果:
    • 五、|| && 条件判断运算符
    • 六、sizeof 运算符
    • 七、位运算符
      • 按位与:&
        • 按位或:|
          • 按位异或:^
            • 左移::<<
              • 右移::>>
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档