首页 > 专题系列 > C基础练习 > C语言运算符优先级以及相关面试题
2014
04-07

C语言运算符优先级以及相关面试题

本来觉得运算符优先级这问题没什么要说的,但是面试题中还是经常遇到,稍不注意就会弄错,现在整理一下。

参考表格:C语言中运算符的优先级

一共有十五个优先级:

1   ()  []  .  ->

2   !  ~   -(负号) ++  –   &(取变量地址)*   (type)(强制类型)    sizeof

3   * / %

4   + -

5   >> <<

6   > >= < <=

7   == !=

8   &

9   ^

10  |

11  &&

12  ||

13  ?:

14   =  +=  -=  *=  /=   %=  |=   ^=   &=   >>=   <<=

15  ,

就着多吧   结合性:2   13  14  是从右至左   其他都是  从左至右有问题可以在交流的。

一个不错的记忆口诀:

括号成员第一;        //括号运算符[]() 成员运算符.  ->

全体单目第二;        //所有的单目运算符比如++、 –、 +(正)、 -(负) 、指针运算*、&

乘除余三,加减四;   //这个”余”是指取余运算即%

移位五,关系六;    //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七;    //即== 和!=

位与异或和位或;    //这几个都是位运算: 位与(&)异或(^)位或(|)    

“三分天下”八九十;  

逻辑或跟与;            //逻辑运算符:|| 和 &&

十二和十一;            //注意顺序:优先级(||)  底于 优先级(&&) 

条件高于赋值,        //三目运算符优先级排到13 位只比赋值运算符和”,”高

逗号运算级最低!    //逗号运算符优先级最低 

相关面试题

这里有一个关于指针的:++*p, *p++ 和 *++p

1)

int a,x;
  for(a=0,x=0;a<=1 && !x++;)
  {
   a++;
  }
  printf("%d,%d\n",a,x);
  结果:1,2
  int a,x;
  for(a=0,x=0;a<=1 && !x++;a++)
  {
   a++;
  }
  printf("%d,%d\n",a,x);
  结果:2,1

2)

 int a=2,x=2,p,q;
  p = (a++)+(a++);
  q = (++x)+(++x);
  printf("%d,%d,%d,%d\n",a,x,p,q);
  结果:4,4,,4,8
说明:a++无论有多少项相加,都是各项先算完表达式,之后再自加1;
      ++x则是所有项先自加,之后再计算表达式。

3)

unsigned char a = 0xA5;
 unsigned char b = ~a>>4;
 b = b;
 printf("b=%d\n",b);
结果:245,即11110101
说明:本题中如果不知道运算时编译器的自动类型转化,按照优先级的顺序,~高于>>,则得到结果是00000101,但是,由于在计算时,4默认为整型,故编译器先将a转化为000000A5后执行~运算,最后>>4,这样就能得到正确的结果。

4)

int b = 3;
 int arr[] = {6,7,8,9,10};
 int *ptr = arr;
 *(ptr++)+=123;
 printf("%d,%d",*ptr,*(++ptr));
结果:8,8
 int b = 3;
 int arr[] = {6,7,8,9,10};
 int *ptr = arr;
 *(ptr++)+=123;
 printf("%d,%d",*ptr,*ptr++);
 结果:7,7
说明:1.printf语句的计算顺序是自右向左,所以才有例1的结果。
      2.++运算符和*运算符具有相同优先级,但结合性是自右向左,故例2中先算ptr++后算*,由于++在变量后时,总是整个表达式计算完之后才将变量加1,故printf执行完之后,才将ptr加1,所以才有例2的结果。

  1. “再把所有不和该节点相邻的节点着相同的颜色”,程序中没有进行不和该节点相邻的其他节点是否相邻进行判断。再说求出来的也不一样是颜色数最少的