zoukankan      html  css  js  c++  java
  • C复杂声明举例

    首先,一些国外的研究成果:

    一个用英语解析复杂声明的网站:http://cdecl.org

    图表说明复杂声明(英):http://c-faq.com/decl/spiral.anderson.html

    另一个举例说明(英):http://www.unixwiz.net/techtips/reading-cdecl.html

    知乎网友:https://www.zhihu.com/question/26931108

    其次,写几个简单例子:

    从未知量开始,一直推理到已知量。

    例子1:char (*comp)()
    1. (*comp)
      comp解引用,这说明comp是个指针
    2. (*comp)()
      comp解引用后调用,这说明comp是个函数指针
    3. char (*comp)()
      comp解引用后调用的返回值是char,这说明comp是个返回值为char的函数指针

    例子2:char (*(*X())[]) ()
    1. X()
      X调用,这说明X是个函数
    2. (*X())
      X调用的返回值解引用,这说明X是个返回值为指针的函数
    3. 现在X是什么已经清楚了,现在的关键是其返回值的类型(用P表示)。
    4. (*X())[]
      P解引用后可以用[]运算,这说明P解引用后还是个指针
    5. (*(*X())[])
      P解引用后用[]运算之后的值还可以用*运算,这说明P解引用后再解引用还是个指针
    6. (*(*X())[]) ()
      P解引用后用[]运算之后再用*运算后可以调用,这说明P三次解引用后是一个函数
    7. char (*(*X())[]) ()
      该函数返回一个char
    8. 总结: X是个返回值为指针的函数,该指针解引用三次后是一个返回值为char的函数。

    最后:如果读C类型声明可以理解为渐进算法的话:

    输入: C语言的类型声明, 例如: int **pi[5];

    输出: 英文的C类型声明解释(由于语言语言, 中文读C类型声明非常不友好), 例如: pi is an Array of 5 Pointer to Pointer to int.

    算法: (过于抽象的话, 后面有例子...)

    I. 首先记住下面的规则:
    i. 一个声明>>必须<<拥有一个基本类型(basic type), 这个基本类型>>总是<<在类型声明表达式的最左边. 然而一个声明可以具有>>0或更多<<个导出类型(derived type). (基本类型表请参照源链接)
    ii. 导出类型由三个操作符(operator)构建:
    i). *: 译为 pointer to, 切记介词to不可省略.
    ii). [x]: 译为 array of, 切记介词of不可省略. (e.g. int ai[5]: ai is array of 5 int)
    iii). ( ): 译为 function returning. 这里的小括号(parentheses)指的是构成函数指针的小括号而不是规定优先级的小括号. 区别: 构成函数指针的小括号永远出现在变量名的右边,而规定优先级的小括号永远将变量名包在里面.
    iv). ii)中的三个操作符的优先级为: [x] 和( ) 优于*.
    II. 首先由变量名以及处于最左边的基本类型构成不完整的解释. 然后从变量名开始由内向外解释声明, 遵从"能向右解读就向右解读, 必须向左解读时再向左解读".


    Example: 就用提问里第二个 char (*(*x( ))[ ]) ( ); 解释上面的算法:

    Step 1: (首先由变量名以及处于最左边的基本类型构成不完整的解释.): x is ... char. 下面逐步在"..."处增添关于x的解释.
    Step 2: (由于( ) 的优先级高于*, 向右解读): x( ): x is a function returning ... char.
    Step 3: (遇到右括号, 向左解读): *x( ): x is a function returning pointer to ... char.
    Step 4: (由于[ ] 优先级高于*, 向右解读): (*x( ))[ ]: x is a function returning pointer to array of ... char.
    Step 5: (遇到右括号, 向左解读): *(*x( ))[ ]: x is a function returning pointer to array of pointers to ... char.
    Step 6: (最后的右边的括号): (*(*x( ))[ ]) ( ): x is a function returning pointer to array of pointers to function returning char.

    结果和cdecl的输出一致.

  • 相关阅读:
    webpack
    react 原理
    jest
    input 自动获取焦点
    taro
    html5标签
    webpack
    每日日报
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/litifeng/p/7798780.html
Copyright © 2011-2022 走看看