zoukankan      html  css  js  c++  java
  • C语言拾遗(二):符号重载

    C语言一个很重要的特点是简洁。但有时候它太简洁了,仅增加,修改或删除一个字符,原先的程序就可以截然不同。

    简洁的C语言会让一个符号,在不同的上下文环境里表示不同的意思。这称之为符号“重载”。

    比如void符号,会有以下常见的不同含义:

    1>作为函数的返回类型,表示不返回任何值

    2>在指针声明中,表示通用指针

    3>位于函数的参数列表中,表示没有参数

    再来举个乘号的例子,看看有趣的,“糟糕的”符号重载吧。

    上代码:

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     int p, N = 5, *q = &N;
     6 
     7     p = N * sizeof * q;
     8     printf("p = %d.\n", p);
     9 
    10     p = N * sizeof(int) * p;
    11     printf("p = %d.\n", p);
    12 
    13     p = N * sizeof((int) * q);
    14     printf("p = %d.\n", p);
    15     
    16     /* 错误: 双目运算符 * 操作数(‘unsigned int’和‘int *’)无效*/
    17     //p = N * sizeof(int) * q;
    18     //printf("p = %d.\n", p);
    19     
    20     return 0;
    21 }

    先不要看变量的定义(因为变量的类型会有提示作用哦),直接看line7,10,13,17的表达式,你知道分别表示什么意思吗?

    好了,看结果吧,

    randy@ubuntu:~/C_Language$ ./a.out
    p = 20.
    p = 400.
    p = 20.

    解释:

    line7:又遇到sizeof了,记住,sizeof是运算符,不是函数。sizeof的操作数是类型时,必须叫括号,比如sizeof(int)。N=5,q是指针,指向N的地址,

    所以*q=5,是int类型,sizeof(int)=4,故p=5*4=20.

    line10:p=5*4*20=400.

    line13:其实是跟line7一样一样儿的。

    line17:该表达式被我注掉了,因为编译不通过。应该知道原因了吧?(答案在注释)

    小结:例子中,一个小小的*是不是有点绕人,当然还有很多其他符号重载的例子。

       比如 staticextern, &, <, () 等。

       这是C语言的简洁之美呢,还是简洁之痛呢?抛砖引玉,欢迎讨论!

    ---End---

  • 相关阅读:
    mssqlserver字符串日期互相转换
    使用TripleDES算法加密/解密
    记录google,yahoo,bing爬虫记录的插件
    C#中编写sqlserver中自定义函数,实现复杂报表
    最基本的Socket编程 C#版
    基于.net平台的web框架搭建
    未来五年程序员需要掌握的10项技能
    一段输入框控制代码,包含所有控制条件!
    C#多线程编程实例编程
    C# WinForm开发系列 Socket/WCF/Rometing/Web Services
  • 原文地址:https://www.cnblogs.com/RandyXu/p/2976382.html
Copyright © 2011-2022 走看看