C++ 的奇技淫巧

2015-01-07 18:12:52 +08:00
 abcdabcd987

是时候祭出大杀器了,出自 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;
}
1607 次点击
所在节点    C
16 条回复
mackyzhan
2015-01-07 19:09:34 +08:00
main函数int类型没返回值,最起码return个0吧?
abcdabcd987
2015-01-07 19:25:03 +08:00
@mackyzhan 这个是 C++ ,不是 C
ispinfx
2015-01-07 19:39:10 +08:00
@abcdabcd987 不是c++才要返回吗
sumhat
2015-01-07 19:50:09 +08:00
这和 #define TRUE FALSE 本质上是一样的
likebeta
2015-01-07 19:51:31 +08:00
看起来很厉害
auser
2015-01-07 20:01:05 +08:00
@mackyzhan @abcdabcd987 @ispinfx

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

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

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

我正是觉得,这个例子并不那么容易看出来,所以就偷懒没有语言加工了(事实上,那句话还是直接从原文抄下来的,懒到没药救了)。我感觉,如果 --> 那篇帖子,没有用一些诱导性的语句的话,并没有什么特别之处。
hxtheone
2015-01-08 10:22:42 +08:00
操作符重载?
abcdabcd987
2015-01-08 10:42:11 +08:00
@hxtheone 是的
vinceguo
2015-01-08 13:34:24 +08:00
关于运算符重载,除非重载后意思很明白而且能带来极大方便,否则能不用就不要用。它们本质上就是函数调用而已。观点来自《thinking in c++》
faywong8888
2015-01-08 19:51:54 +08:00
这个题比较好玩。
gdgoldlion
2015-01-08 22:03:48 +08:00
@vinceguo 运算符重载的最大问题是,数学本身研究的问题很多,公式运算优先级比较复杂,很难找到一种方式能让运算符很好的对应,比如叉乘到底应该不应该重载运算符的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/160063

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX