V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abcdabcd987
V2EX  ›  C

C++ 的奇技淫巧

  •  
  •   abcdabcd987 · 2015-01-07 18:12:52 +08:00 · 1722 次点击
    这是一个创建于 3608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是时候祭出大杀器了,出自 http://coolshell.cn/articles/1724.html

    请看下面这段代码,你能告诉我它会输出什么吗?

    #include <iostream>
    #include <vector>
    
    typedef int UINT4;
    using namespace std;
    class Hack
    {
    };
    
    Hack& operator< (Hack &a , Hack &b)
    {
        std::cerr << "小于操作符\n";
        return a;
    }
    
    Hack& operator> (Hack &a, Hack &b)
    {
        std::cerr <<  "大于操作符\n";
        return a;
    }
    
    int main(int argc, char ** argv)
    {
        Hack vector;
        Hack UINT4;
        Hack foo;
    
        vector<UINT4> foo;
    }
    
    16 条回复    2015-01-08 22:03:48 +08:00
    mackyzhan
        1
    mackyzhan  
       2015-01-07 19:09:34 +08:00 via Android
    main函数int类型没返回值,最起码return个0吧?
    abcdabcd987
        2
    abcdabcd987  
    OP
       2015-01-07 19:25:03 +08:00
    @mackyzhan 这个是 C++ ,不是 C
    ispinfx
        3
    ispinfx  
       2015-01-07 19:39:10 +08:00 via iPhone
    @abcdabcd987 不是c++才要返回吗
    sumhat
        4
    sumhat  
       2015-01-07 19:50:09 +08:00
    这和 #define TRUE FALSE 本质上是一样的
    likebeta
        5
    likebeta  
       2015-01-07 19:51:31 +08:00
    看起来很厉害
    auser
        6
    auser  
       2015-01-07 20:01:05 +08:00   ❤️ 1
    @mackyzhan @abcdabcd987 @ispinfx

    对于C++ 没有的话默认返回0

    C99标准里Program termination一节有这么一段:
    reaching the } that terminates the main function returns a value of 0
    BGLL
        7
    BGLL  
       2015-01-07 20:06:35 +08:00
    小于操作符
    大于操作符
    BGLL
        8
    BGLL  
       2015-01-07 20:09:05 +08:00
    障眼法,重新定义操作符太明显了,还不如昨天那个C语言奇技淫巧的-->
    abcdabcd987
        9
    abcdabcd987  
    OP
       2015-01-07 20:16:43 +08:00
    @sumhat 是啊,都是故意写出来坑爹的
    @auser 原来C99允许 main 不写 return 0 啊,学习了。我其实一直没有认真学过 C,直接学 C++ 的。
    @BGLL 我反而觉得 --> 实在是太明显了,这个要说出原因来并不是那么容易
    BGLL
        10
    BGLL  
       2015-01-07 20:35:34 +08:00
    @abcdabcd987
    这个摆明了重新定义了vector、<、>,看到这就能猜到要弄个vector<>出来,太赤果果了。
    --> 那个还煞有介事的说出个“趋向于”、“快速趋向于”来迷惑人,一般人一看会先去想:“还有个趋向于运算符?怎么从没听过?”然后开始回忆去了......
    abcdabcd987
        11
    abcdabcd987  
    OP
       2015-01-07 20:57:00 +08:00
    @BGLL
    说实话,看到 --> 的那个帖子,我看到“趋向于”感到很好奇,然后看到代码后立马就笑喷了,是毫不迟疑地笑喷了,几乎没有反应时间。

    但是这个,我确实要仔细想一想 vector<UINT4> foo 这句话具体是怎么执行的,想想为什么 vector 和 UINT4 并不是代表 std::vector 和 int 。加上我这种第一眼自动忽略变量定义的习惯,确实需要反应一段时间。

    我正是觉得,这个例子并不那么容易看出来,所以就偷懒没有语言加工了(事实上,那句话还是直接从原文抄下来的,懒到没药救了)。我感觉,如果 --> 那篇帖子,没有用一些诱导性的语句的话,并没有什么特别之处。
    hxtheone
        12
    hxtheone  
       2015-01-08 10:22:42 +08:00
    操作符重载?
    abcdabcd987
        13
    abcdabcd987  
    OP
       2015-01-08 10:42:11 +08:00
    @hxtheone 是的
    vinceguo
        14
    vinceguo  
       2015-01-08 13:34:24 +08:00
    关于运算符重载,除非重载后意思很明白而且能带来极大方便,否则能不用就不要用。它们本质上就是函数调用而已。观点来自《thinking in c++》
    faywong8888
        15
    faywong8888  
       2015-01-08 19:51:54 +08:00
    这个题比较好玩。
    gdgoldlion
        16
    gdgoldlion  
       2015-01-08 22:03:48 +08:00
    @vinceguo 运算符重载的最大问题是,数学本身研究的问题很多,公式运算优先级比较复杂,很难找到一种方式能让运算符很好的对应,比如叉乘到底应该不应该重载运算符的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   913 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:52 · PVG 05:52 · LAX 13:52 · JFK 16:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.