C语言声明的优先级规则

《Expert C Programming》(《C专家编程》)中提到C语言声明的优先级规则如下:

A 声明从它的名字开始读取,然后按照优先级顺序依次读取;

B 优先级从高到低依次是:

B.1 声明中被括号括起来的那部分;

B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组;

B.3 前缀操作符:星号*标识“指向……的指针”;

C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。

并举例说明:char * const * (*next)();

A      next      ——next为声明的名字

B.1  (*next)       ——next为一个指向……的指针

B.2  (*next)()     ——next是一个函数指针

B.3  *(*next)()     ——next是一个函数指针,这个函数返回一个指向……的指针

C    char * const     ——指向字符类型的常量指针

故 char * const *(*next)();的含义就是: next是一个函数指针,这个函数返回一个指向字符类型的常量指针

下面我们来自己分析一个声明:

int(*foo())[];

自己先推导一下,然后看看结果结果:foo为一个函数,这个函数返回一个指向整型数组的指针。对不对呢?下面我们来看具体的推导过程:

A    foo               ——foo为声明的名字

B.2  foo()              ——foo为一个函数

B.3  (*foo())           ——foo为一个函数,这个函数返回一个指向……的指针

B.2  (*foo())[]          ——foo为一个函数,这个函数返回一个指向数组的指针

C    int (*foo())[]       ——foo为一个函数,这个函数返回一个指向整型数组的指针

时间: 2024-12-31 12:53:42

C语言声明的优先级规则的相关文章

C语言运算符的优先级和结合性实例详解_C 语言

运算符是告诉编译程序执行特定算术或逻辑操作的符号.C语言的运算范围很宽,把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理.主要分为三大类:算术运算符. 关系运算符与逻辑运算符.除此之外,还有一些用于完成特殊任务的运算符. 先来看一个例子: #include <stdio.h> int main(){ int a=10,b=1,c=2; a=b=c; printf( "12+3*5=%d\n", 12+3*5); printf( "a=%d, c=%

C语言运算符及其优先级汇总表口诀

由于C语言的运算符优先级与C++的不完全一样(主要是增加了几个运算符),所以这个口诀不能完全实用于C++.但是应该能够兼容,大家可以比较一下他们的区别应该就能够很快掌握C++的优先级的   C语言运算符及其优先级汇总表口诀 圆下箭头一顿号 非凡增减富强针地长 三乘除,四加减,五移位 千万别把鱼忘记,它在盛饭的厨子里 小灯大灯灯灯不等 爸喂鱼,舅疑惑,裸鸡也疑惑 十三姨,十四父,十五逗,兜到低 "圆下箭头一顿号"指的是第15级的运算符.其中圆指的是运算符(),下指的是下标运算符[],箭头

Go语言声明一个多行字符串的变量_Golang

Go如何声明一个多行字符串的变量?使用 ` 来包含即可. package main import ( "fmt" ) func main() { str := `hello world v2.0` fmt.Println(str) } Demo:http://play.golang.org/p/BOL8_SwQ0D 以上所述就是本文的全部内容了,希望大家能够喜欢. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索

C语言函数的作用域规则

"语言的作用域规则"是一组确定一部分代码是否"可见"或可访问另一部分代码和数据的规则. C语言中的每一个函数都是一个独立的代码块.一个函数的代码块是隐藏于函数内部的,不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用g o t o语句跳转到另一个函数内部是不可能的).构成一个函数体的代码对程序的其它部分来说是隐蔽的,它既不能影响程序其它部分,也不受其它部分的影响.换言之,由于两个函数有不同的作用域,定义在一个函数内部的代码数据无法与定义在另一个函数

sql语言分类和编写规则

1.数据查询语言(select语句):用于检索数据库数据 2.数据操纵语言(Data Manipulation Language,DML):用于改变数据库数据,包括insert,update和delete三条语句 3.事务控制语言(Transactional Control Language,TCL):用于维护数据的一致性, 包括commit,rollback和savepoint三条语句.其中commit语句用于确认已经进行的数据库改变,rollback语句用于取消已经进行数据库改变,而save

c语言-声明一个数组,由用户输入数组长度。不赋初值不报错,赋初值就报错?为什么

问题描述 声明一个数组,由用户输入数组长度.不赋初值不报错,赋初值就报错?为什么 基本上,代码如下: #include<stdio.h> int main(){ int num = 0; printf(""输入数组长度:""); scanf(""%d""&num); int arr[num]; //编译不报错 //int arr[num] = {0}://编译报错 return 0;} 解决方案 因为C语言

c语言-关于运算符优先级的问题。急求指导。

问题描述 关于运算符优先级的问题.急求指导. 1. struct num {int a,b;}s[]={{1,6},{2,3}},*p=s; printf("%d",p->b/s[1].a*++p->a); 为什么输出6?先算p->b再算s[1].a,之后是++p->a,最后算乘除对吗. ++p->a为什么是2?->的优先级不是比++高么,为什么不是先取值再++ 2. static int a[10]={1,3,5,7,9}; int *p=a; p

c语言-这个改变优先级的代码哪里错了?谢谢

问题描述 这个改变优先级的代码哪里错了?谢谢 for(i=0;i<nSize;i++) { do { if(stud[i].eventdate.day==day &&stud[i].eventdate.month==month &&stud[i].eventdate.year==year) stud[i].level = stud[i].level+1; } while(stud[i].eventdate.day==day &&stud[i].even

基于c语言知识点的补遗介绍_C 语言

使用C很长时间,但是很难说对c的各个点都十分的透彻.虽然c不像c++那样复杂,但是还有很多叽里旮旯儿:并不是他们有多难,而是在于他们平时用的不多,或者和人的第一直觉相悖,再或者初学时经验有限理解不深根本没有记住.下面的这些东西可能来自<c专家编程>或者网络.最近发现基础的经典的书籍常读常新,原因可能有两个:1.随着自己经验的增长,你的认识可能会不一样,思维的方式也会有所变化,而得到的东西自然会是新的东西.2.早些时候经验有限,有些点可能根本就没有完全理解.现在你可以理解的更深刻.这方面的书籍再