typedef声明变量也是一种求值过程
2024-09-04 01:05:27
前言:
什么叫做:声明变量是求值过程?请看下面的声明,
int i;
很简单,声明了个整型变量i,再看如下声明,
int *p;
也很简单,立刻反应出来它是指向整型的指针,但是具体如何推倒出来的呢?其实在C语言中,变量的声明就是一种求值过程,把*p这部分声明看成表达式,对这个表达式的求值的结果是int类型,这样就可以倒推出p是指针整型的指针了,因为只有对指向整型的指针进行解引用操作才是整型类型!还有很多复杂的声明,都可以使用这种方法求其具体的类型。
下面让我们来验证typedef定义的新类型和普通的声明变量一样,也是一种求值过程:
/*
验证:
用typedef定义的新类型名声明的变量是否与普通的声明变量一样,是一种求值的过程,还是单纯的替换过程?
*/ typedef short int arrTen[]; //定义了一个新类型,这个类型是:一个包含10个short类型元素的一维数组 int main(){
short int j;
short int myarr[];
arrTen *arr1;
/*
现在需要验证arr1的类型:
假设是求值过程,那么意味着对表达式*arr1求值的结果是arrTen类型,也就是说arr1是一个指针,指向一个数组,但是在C语言中数组是一个很朴素的概念,它只是连续的内存单元,所以指向一个数组准确地说是指向一片拥有10个short元素的内存空间
假设是替换过程,那么上述声明相当于:short int *arrTen[10],而这个声明意味着arrTen是一个拥有10个元素的数组,每个元素的类型是指针,指向short类型的内存单元,在这里发现了问题,如果声明(用typedef定义(或声明)新类型时和用typedef声明变量时)用到了很多操作符,替换过程就会出现优先级的失调,所以在此猜测这种假设是错的
*/ /* 实际操作验证 */
//arr1[1]=&j; //报错,GCC5.2:error: assignment to expression with array type
arr1=&myarr; //未报错,myarr的类型是一个指向short的指针,而&myarr的类型是一个指向拥有10个short元素的数组的指针
/* 综上,arr1是一个指向数组的指针,所以第一种假设成立,typedef声明变量时也是一种求值过程 */ return ;
}
最新文章
- java使用tomcat7的maven插件发布到服务器
- mysql中event的用法详解
- python中的GIL(全局解释锁)多线程能够提升效率
- 如何关闭emacs开启时自己打开的欢迎界面
- Sql Server 按行处理表数据思路
- C#操作XML,如何获取指定节点值?
- 一个基于Myeclipse开发的Java打地鼠小游戏(Appletcation)
- 使用Maven构建Web项目
- 结构-行为-样式-requireJs实现图片轮播插件
- FZU Problem 1895 整除45问题(整除问题+字符串维护+优化)
- 模仿jquery的fileupload插件
- c语言实现封装、继承和多态
- ASP.NET Core中使用GraphQL - 第三章 依赖注入
- linux服务器时间同步失败解决方法
- windows下特殊字符无法用来命名
- chrome扩展写法
- 20145122《Android开发基础》实验四实验报告
- 《C++ Primer Plus》读书笔记之十二—C++中的代码重用
- 【JUC源码解析】SynchronousQueue
- 添加jQuery方法解析url查询部分