C专家编程 第3章 分析C语言的声明 3.1 只有编译器才会喜欢的语法

博客讨论了C语言声明语法的复杂性,指出其对编译器设计者而非程序员友好。作者引用了Kernighan和Ritchie的观点,强调声明的阅读方向问题以及volatile和const关键字带来的困惑。文章还提到了C++中更好的声明方式,并举例说明了指针和类型的声明。最后,文章探讨了typedef在声明中的作用,以及一个复杂的函数声明解析示例。
摘要由CSDN通过智能技术生成

    <<爱丽丝漫游奇境记>>  
    作者笔名:Lewis Carroll 
    作者真名:Charles Dodgson 
    事件:维多利亚女王

    编程语言中的类型模型(type model)。例如,下面的C语言声明: 
    typedef char *string;
    string punchline = "I'm a frayed knot"; 
    按照骑士的思维方式,他会这样进行理解:
                               被称作                是 
    变量的类型         string                 char *
    变量                    punchline          I'm a frayed knot

    3.1 只有编译器才会喜欢的语法
    Kernighan和Ritchie承认,“C语言声明的语法有时会带来严重的问题”。C语言声明的语法对于编译器(或编译器设计者)的处理来说并不是什么大不了的事。C语言声明的语法实在是非常可怕,渗透于整个语言使用的方方面面。毫不夸张地说,正是由于在组合类型方面的笨拙行为,C语言被
显著且毫无必要地复杂化了。 
    C语言 类型模型(type model)
    BCPL语言(C语言的祖先)几乎没有类型,它把二进制字作为唯一的数据类型,所以C语言先天有缺。然后出现了一种C语言设计哲学,要求对象的声明形式与它的使用形式尽可能相似。这种做法的好处是各种不同操作符的优先级在“声明”和“使用”是一样的。 它的缺点在于操作符的优先级是C语言中另外一个设计不当、过于复杂之处。 
    一个比较好的声明指针的方法是:
    int &p;
    它至少能提示p是一个整型数的地址。这种语法已被C++采纳,用于表示参数的传址调用。 
    C语言的声明所存在的最大问题是,你无法以一种人们所习惯的自然方式从左向右阅读一个声明,在ANSI C引入了volatile和const关键字后,情况就更糟糕了。volatile和const关键字后,只能出现在声明中,而不是使用中。风格看上去像是声明,但却没有标识符的东西(如形式参数声明和
强制类型转换)看上去滑稽。 
    强制类型转换
    char (*j)[20]; //j是一个指向数组的指针,数组内有20个char元素
    j = (char (*)[20]) malloc(20);

    //the object pointed to by pointer is read_only
    const int *grape;
    int const *grape;
    //pointer is read_only
    int * const grape_jelly;

    //the object pointed to by pointer is read_only and pointer is also read_only
    const int * const grape_jam;
    int const * const grape_jam;

    ANSI C提到,typedef说明符之所以被称为“存储类型说明符”,只是为了语法上的方便而已。
    char * const *(*next)();

    你能知道如何分析这个函数的声明吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值