C++声明、定义、复杂声明及typedef专题(6)
时间:2026-01-20
时间:2026-01-20
本文对C++的复杂声明,作了深入地道的讲解,对使用typedef化简复杂声时和还原复杂声明也作了深入详细的讲解。
第2 章复杂声明及typedef的使用
第1节复杂声明
一、运算符的基本规则
1、声明之所以复杂主要是由于*、[]、( )这3种运算符的作用,才使声明变得很复杂,其中*表示指向....的指针,()表示反回类型为....的函数,[]表示....的数组。
2、*是前缀运算符,()和[]是后缀运算符,前缀运算符只能出现在标识符的前面,而后缀运算符则只能出现在标识符的后面,比如int [22]a; int b*; int *[]c; 是错误的,再如int *[] f();错误,后缀运算符[]只能出现在标识符的后面。
二、复杂声明的分析方法
1、优先级规则法:
1)、首先应从未声明的标识符(就是名字)开始分析,应注意区分函数的形参名和被声明的标识符名。
2)、声明中被小括号”()”括起来的内容,优先级最高,若小括号有多层,则最里层的优先级最高,小括号不会与函数运算符的小括号相混淆,这从语句中可以明显的看出来。
3)、后缀运算符比前缀运算符优先级高。
4)、反缀运算符具有相同的优先级,当有多个后缀运算符时,则应按从左到右的顺序进行分析。
5)、当有多个前缀运算符时,应按从右到左的顺序进行分析。
6)、有const和volatile限定词时,若const或volatile后面紧接着的是类型区分符(如int, float等),则限定词将作用于类型区分符,否则,限定词将作用于它左边紧邻的指针运算符(即星号”*”)。这里要注意,若const左边没有指针运算符,则const应是作用于类型区分符,比如int const *p; 与const int *p;是等同的都表示指针指向的是const int类型的变量;同理const int a[1]; 与int const a[1];也是等同的,都表示数组a存储的是数据是const int 类型的。
7)、若声明中有多个标识符(主要是函数的形参名),则从左向右看,最左边的标识符是未声明的标识符。因为函数形参名只能出现在小括号中(区别优先级的小括号除外),而表示函数的小括号()是后缀运算符,后缀运算符只能出现在标识符之后,而未声明的标识符也只能有一个,因此从左向右看第一个出现的标识符一定是未声明的标识符,再后面的标识符只能是函数形参。
8)、注意:若const的左右都没有类型区分符,且左边也没有*指针运算符时,这种声明讲是错误的,比如int (const p)=0;是错误的,再如int (const p[3]); int *(const p)=0; int *(const p[3])={0};等都是错误的。
2、右左法则:
1)、从标识符开始,先向右看,然后再向左看,若遇小括号,则进入小括号进行上述规则,有const和volatile限定词时的规则同优先级规则第6条,若有多个标识符时,则优先级规则的规则7同样适用于右左法则。
2)、右则法则原理:由优先级规则的第1,2,3,4,5条可以明显的看出右左法则的原理。因为后缀优先级高于前缀,且后缀算符只能出现在标识符之后。因此,分析标识符的类型时,总要先向右边看有没有比前缀运算符优先级更高的后缀运算符,然后再看左边。
3)、注意,右则法则不是指的右边看一下左边看一下,而是要先向右看完所有的运算符,直到遇到反小括号或没有运算符时再向左看。比如int **(*p[4][5])[6]; 先向右看,p先与[4]结合,再向右看,再与[5]结合,再向右看,遇到反小括号,向左看,与*结合,跳出小括号,向右看,与[6]结合,右边已经没东西了,再向左看与*结合,再向左看再与*结合,最后再向左看与int结合。
3、复杂声明时标识符究竟是什么(数组,指针,函数或变量?)
1)、若与标识符第一个接合的运算符是一个指针符号*,则该标识符就是指向....的指针,也就是说标识符就是一个指针,只是这个指针指向的内容可能很复杂。比如int (*b)[]; 标识符b先与*接合,因此b是一个指针,这个指针指向的是一个数组,再如int *(*b)();表示b是一个指针,这个指针指向的是一个反回类型为int *的函数。
2)、若与标识符第一个接合的是数组下标运算符[],则该标识符是....的数组,也就是说这个标识符一定是个数组,只是数组里存储的内容可能很复杂。比如int *a[]; 因为[]优先级更高,因此标识符a先与[]接合,因此标识符a是一个数组,这个数组里的内容是int *的指针;
3)、若与标识符第一个接合的是函数符(),则该标识符是反回....的函数,也就是说这个标识符就是一个函数,只是这个函数的反回类型可能很复杂。int (*f())[];表示f是一个函数,这个函数反回的是一个指针,这个指针指向的是一个数组。
4、示例:
…… 此处隐藏:21字,全部文档内容请下载后查看。喜欢就下载吧 ……