c语言中运算的优先级,C语言中的运算符优先级

这个是我们最容易忽视的一个地方,因为今天做了几个笔试题,感觉这个很重要,能很好的帮助我们记忆数组指针,指针数组,函数指针和指针函数,下面我总结了一些总结的小技巧,是为了应付笔试╭(╯^╰)╮。

—————————————————————————————————————————————————————————————————————————————

首先我还是贴一下网上找的笔试题吧:

1.int (*s[10])(int) 表示的是什么?

答案:int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

我的理解:想做对这个题目就是考你的优先级掌握情况, [ ]高于* 所以 *s[10]是指针数组(本质是数组),这个时候我们把 s[10] 当做一个变量a (方便我们理解) 再来看这个式子:int (*a) (int) 这个就是函数指针(本质是指针),最后再看一下,展开,就是函数指针数组。这里有一个小技巧,最先结合的本质就是什么,名字也会放在最后面。 再来理一下思路:[ ]最先结合,*其次,最后后面接了一个参数说明是函数,那么读起来就要反过来:函数指针数组!

指针函数:本质是函数

int * func()  赋值:int *a; a=func();

函数指针:本质是指针

int (*func)()  赋值:int f (); func=f;

#include

int pri(void)

{

printf("lzj\n");

}

void main()

{ int (*func)();

func=pri;

(*func)();

}

数组指针:本质是指针

int (*p)[4]  赋值:int a[x][4]; p=a;  x为1,2,3...

指针数组:本质是数组

int * p[4]  赋值:int *a ; a=p;

2.在物理内存0x30008000地址存放一个入口函数,他的返回值类型为int,无输入参数。如果想跳到0x30008000去运行这个函数,该怎么办?

答案:   *((int (*) ()) 0x30008000)()

我的理解:题目说了返回值是int,我们就要把它强制类型转化为一个函数指针int (*)() -->( int (*)( ) )0x30008000 然后再去调用即可用*去调用它。

这里我们还是可以看到优先级的问题,它是先和*结合,说明是一个指针,然后后面接了参数,说明是函数,那么就是一个函数指针。

============================================================================================

其实我们的函数可以拆分来看:int a ()前面是返回类型,中间是函数名,也就是函数的入口地址,后面是形参

int * a ()  这里可以看出()优先级高,而且顺序也是左到右,所以a是一个函数,该函数的入口地址就是它本身,返回的是一个地址.

int (*a) () 这里把a 和*括在一起了,函数的入口地址是一个指针的地址,说明a本身指针,里面存放的是函数的返回类型是int,形参是()里面的一个函数地址

============================================================================================

3.用变量a给出下面的定义

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 An array of ten pointers to functions that take an integer argument and return an integer )

答案:

a) int a;

b) int *a;

c) int **a;

e) int *a[10];

f) int (*a)[10];

g) int (*a)(int);

h) int (*a[10])(int);

解析:这个就按我的那个方法来判断的话就很容易了,这里需要提醒的是函数是有返回类型,而其他普通的变量没有,所以前面的int理解有所不同。

—————————————————————————————————————————————————————————————

最后贴一下运算符优先级顺序表:特别是&,它取地址和与运输的时候优先级不一样。

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[整型表达式]

左到右

()

圆括号

(表达式)/函数名(形参表)

.

成员选择(对象)

对象.成员名

->

成员选择(指针)

对象指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针表达式

单目运算符

&

取地址运算符

&左值表达式

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof 表达式/sizeof(类型)

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式%整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

表达式<

左到右

双目运算符

>>

右移

表达式>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

整型表达式&整型表达式

左到右

双目运算符

9

^

按位异或

整型表达式^整型表达式

左到右

双目运算符

10

|

按位或

整型表达式|整型表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值