zoukankan      html  css  js  c++  java
  • typedef声明变量也是一种求值过程

    前言:

    什么叫做:声明变量是求值过程?请看下面的声明,

    int i;

    很简单,声明了个整型变量i,再看如下声明,

    int *p;

    也很简单,立刻反应出来它是指向整型的指针,但是具体如何推倒出来的呢?其实在C语言中,变量的声明就是一种求值过程,把*p这部分声明看成表达式,对这个表达式的求值的结果是int类型,这样就可以倒推出p是指针整型的指针了,因为只有对指向整型的指针进行解引用操作才是整型类型!还有很多复杂的声明,都可以使用这种方法求其具体的类型。

    下面让我们来验证typedef定义的新类型和普通的声明变量一样,也是一种求值过程:

     1 /*
     2 验证:
     3 用typedef定义的新类型名声明的变量是否与普通的声明变量一样,是一种求值的过程,还是单纯的替换过程?
     4 */
     5 
     6 typedef short int arrTen[10]; //定义了一个新类型,这个类型是:一个包含10个short类型元素的一维数组
     7 
     8 int main(){
     9     short int j;
    10     short int myarr[10];
    11     arrTen *arr1;
    12     /*
    13     现在需要验证arr1的类型:
    14     假设是求值过程,那么意味着对表达式*arr1求值的结果是arrTen类型,也就是说arr1是一个指针,指向一个数组,但是在C语言中数组是一个很朴素的概念,它只是连续的内存单元,所以指向一个数组准确地说是指向一片拥有10个short元素的内存空间
    15     假设是替换过程,那么上述声明相当于:short int *arrTen[10],而这个声明意味着arrTen是一个拥有10个元素的数组,每个元素的类型是指针,指向short类型的内存单元,在这里发现了问题,如果声明(用typedef定义(或声明)新类型时和用typedef声明变量时)用到了很多操作符,替换过程就会出现优先级的失调,所以在此猜测这种假设是错的
    16     */
    17 
    18     /* 实际操作验证 */
    19     //arr1[1]=&j; //报错,GCC5.2:error: assignment to expression with array type
    20     arr1=&myarr; //未报错,myarr的类型是一个指向short的指针,而&myarr的类型是一个指向拥有10个short元素的数组的指针
    21     /* 综上,arr1是一个指向数组的指针,所以第一种假设成立,typedef声明变量时也是一种求值过程 */
    22 
    23     return 0;
    24 }
  • 相关阅读:
    httpd配置
    thymeleaf js 方法中参数 如何拼接进json对象,不转换为[object,object]
    mysql 8.0.18.zip安装配置方法图文教程(windows 64位)
    SpringBoot配置devtools实现热部署
    构建工具 Maven 的使用
    Java的 JAVA_HOME、Path、CLASSPATH环境变量小结
    IDEA创建springboot项目,特殊项目目录介绍(.idea、.iml、.gitignore、.mvn、mvnw、mvnw.cmd、.gitimodules、.gitkeep)
    统计代码量——SourceCounter.exe
    yml配置之static-path-pattern 与 static-locations,静态资源的访问
    联合索引
  • 原文地址:https://www.cnblogs.com/ryzz/p/12233761.html
Copyright © 2011-2022 走看看