LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1316|回复: 13

让人吐血的 C&C++ 语法

[复制链接]
发表于 2003-12-25 19:57:20 | 显示全部楼层 |阅读模式
看看下面的程序,你可以把他拿到机器里面跑一遍,就可以知道C的语法多么的灵活。

int main(int argc, _TCHAR* argv[])
{
        int a[] = {1,2,3};
        printf("Word Is %d\n",2[a]);
        getchar();
        return 0;
}

有人说了,这个东西有什么用处啊?
想想C++中的,operator []

在特殊的情况下,我们就可以用上这个技巧了。
当然,这个特殊情况肯定后维护代码的…………nightmare啊~
发表于 2003-12-25 19:59:12 | 显示全部楼层

回复: 让人吐血的 C&C++ 语法

最初由 gyb997 发表
看看下面的程序,你可以把他拿到机器里面跑一遍,就可以知道C的语法多么的灵活。

int main(int argc, _TCHAR* argv[])
{
        int a[] = {1,2,3};
        printf("Word Is %d\n",2[a]);
        getchar();
        return 0;
}

有人说了,这个东西有什么用处啊?
想想C++中的,operator []

在特殊的情况下,我们就可以用上这个技巧了。
当然,这个特殊情况肯定后维护代码的…………nightmare啊~

红色那里看不懂,请解释一下!
 楼主| 发表于 2003-12-25 20:03:39 | 显示全部楼层

明白了

要是把这个换成a[2],我想你肯定是明白的.
2[a]和a[2]其实就是一样的,在编译器的内部就是*(p+2).

但是,在C++ 运算符 operator下面就不一样了。
发表于 2003-12-25 22:08:09 | 显示全部楼层
程序写出来是为了给人看的,不是给编译器看的。如果一个大型软件的源代码里面到处都是这样的trick,那这个软件的维护成本将会相当相当高。
发表于 2003-12-25 22:09:59 | 显示全部楼层
这个是不是编译器的问题?不同的编译器是不是会产生不同的行为?
还是用C、C++标准的用法吧。
 楼主| 发表于 2003-12-25 22:38:36 | 显示全部楼层
说说是那个编译器,我反正在gcc和vc下面都是通过的
而且,返回的都是3
发表于 2003-12-25 23:28:59 | 显示全部楼层
就是“基地址+偏移量”,象linux kernel中就有a[-1]。
发表于 2004-1-1 18:34:45 | 显示全部楼层
这是标准C语法!
与编译器无关!
发表于 2004-1-3 01:39:24 | 显示全部楼层
又学了一招,呵呵呵
发表于 2004-1-3 03:01:21 | 显示全部楼层
“主公,臣认为,苦涩难懂的语句并不是好事。”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表