C语言-右左法则

右左法则是一个既著名又常用的方法。不过,右左法则其实并不是c标准里面的内容,它是从c标准的声明规定中归纳出来的方法。c标准的声明规则,是用来解决如何建立声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:

the right-left rule: start reading the declaration from the innermost parentheses, go right, and then go left. when you encounter parentheses, the direction should be reversed. once everything in the parentheses has been parsed, jump out of it. continue till the whole declaration has been parsed.

这段英文的翻译如下:

右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

笔者要对这个法则进行一个小小的修正,应该是从未定义的识别符号开始阅读,而不是从括号读起,之所以是未定义的识别符号,是因为一个声明里面可能有多个识别符号,但未定义的识别符号只会有一个。

下面是一道面试题,我们可以通过分析这道题来学会使用右左法则:

用变量a给出下面的定义
     e) 一个有10个指针的数组,该指针是指向一个整型数的;
     f) 一个指向有10个整型数数组的指针;
     g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
     h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;

 【标准答案】e)int * a[10];  
            f)int (*a)[10];                                                         
            g)int (*a)(int); 
            h)int (*a[10])(int);

我们来利用右左法则一个一个分析:

e)、首先找到那个未定义的标识符,就是a,先看右边,是一个“ [ ”,这说明是一个数组,然后看左边,是一个" * ",说明是一个指针 ,综上所述,就是一个指针数组,根据前面的类型,整形指针数组。(个人总结:这里其实 首先我们看到的是数组 ,其实这里就可以把数组写在纸上(.......数组),然后我们继续看,看到的就是指针,然后我们把指针加在刚才所记的数组二字的左边,连起来读就是指针数组)

f)、首先找到那个未定义的标识符,就是a,先看右边,是一个括号,这时就应该掉转阅读方向,然后我们看到的就是一个" * ",说明这是一个指针,然后跳出() ,再往右边看,我们看到的就是" [ ",说明设置一个数组,综上,即为 数组指针。(个人总结同上)

g)、h)同理可得。

现在通过一些例子来讨论右左法则的应用,逐步加深:

int   (*func)(int   *p); 
首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值类型是int。 

int   (*func)(int   *p,   int  (*f)(int*)); 
func被一对括号包含,且左边有一个*号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int   *和int  (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int  (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。 

猜你喜欢

转载自blog.csdn.net/weixin_42216720/article/details/119668939