新足迹

 找回密码
 注册

精华好帖回顾

· 新足迹厨艺大展示 12月下:主料鸡块 - 上海白斩鸡 (2008-12-20) patrickzhu · 儿时的最爱--椒盐酥皮点心 (2009-1-10) little_bw
· 更新完毕 2018 圣诞日本之轻井泽-长野-小布施-松本-镰仓-东京 (2019-1-16) ailsalu · 【狸出品】 2013新年家宴 --- 绝品 「三文鱼头汤火锅」+「收尾烫饭」 香浓奶白、 东瀛+南洋风的完美混搭~~ (2013-1-1) 黑芝麻狐儿
Advertisement
Advertisement
12
返回列表 发新帖
楼主:阿Ka

funny code [复制链接]

发表于 2010-11-17 10:45 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 阿Ka 于 2010-11-17 10:42 发表


no! i just conduct a test:

var i = 0
z = ++i / ++i + ++i

and z = 3.5 means z = 1 / 2 + 3, and its from left to right


/比+有优先级,如果只是+,就要看谁在右边了
Advertisement
Advertisement

退役斑竹

发表于 2010-11-17 10:47 |显示全部楼层
此文章由 阿Ka 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿Ka 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 rogerk 于 2010-11-17 10:43 发表


先算乘除后算加减的规则你可还记得?


you can try z = ++i + ++i/++i, then u'll know

发表于 2010-11-17 10:49 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
答案是 10
因为:
++i 是pre-increment,所以 i 先加一再传入下一个 operator

int i=0;
int z = ++i + ++i + ++i + ++i;
            1         2        3        4
=
int z = (++i) + (++i) + (++i) + (++i);
因为 ++ 操作符比 + 操作符级别高,所以先运算++

评分

参与人数 1积分 +5 收起 理由
阿Ka + 5 谢谢奉献

查看全部评分

发表于 2010-11-17 10:58 |显示全部楼层
此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很有意思,在三个不同的系统上编译运行,得到三个不同的结果。
Win7(DOS):16
Linux (Cent-OS 64b, RedHat 32b):11
Solaris 10 (SUN Sparc):10

在Cent-OS 64b下用gcc -S输出ASM代码如下:

        movl    $0, -8(%rbp)    // 这个应该是i=0
        addl    $1, -8(%rbp)   // 第一个++i
        addl    $1, -8(%rbp)   // 第二个++i,现在i是2
        movl    -8(%rbp), %eax  // 把2放如eax
        addl    -8(%rbp), %eax  // 这个最奇怪,我们分析应该是1+2,但gcc做了2+2,理由是:gcc只从-8(%rbp)处取值!所以前++i + ++i,实际上是2+2!

        addl    $1, -8(%rbp) // 第三个++i,此时地址-8(%rbp)处是3
        addl    -8(%rbp), %eax  //累加到eax
        addl    $1, -8(%rbp)  // 第四个++i
        addl    -8(%rbp), %eax // 累加到eax

如此编译,11也是正确的结果。关键是前两个++,因为先要两次++,i 所在的的位置的值已经变成2,编译器是取这个地址里面的值作为 + 运算的左值,所以2+2合理!但我不解的是,同样是gcc,在Solaris下为什么是10,难道是版本问题?Solaris下是3.x.y,Linux下是4.x.y版本的。

[ 本帖最后由 蓝爸爸 于 2010-11-17 11:03 编辑 ]

评分

参与人数 3积分 +7 收起 理由
hbyu + 2 精品文章
kr2000 + 4 你太有才了
阿Ka + 1 最后1分

查看全部评分

发表于 2010-11-17 11:06 |显示全部楼层
此文章由 bulaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bulaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
This is exactly why it's a bad bad idea to play with obscurity. At least not in your production code.
头像被屏蔽

禁止发言

发表于 2010-11-17 11:07 |显示全部楼层

一点难度没有

此文章由 澳贼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 澳贼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Advertisement
Advertisement

发表于 2010-11-17 11:07 |显示全部楼层
此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
另附上C++ Builder 6在Win7下生成的ASM,和gcc类似,也是取 i 所在地址里面的值,不过BCC更狠,是把所有++全执行完,然后做 + 运算,所以最终是 4 x 4 = 16。

;       
;        {
;            int i = 0;
;       
@1:
        xor eax,eax
;       
;            int z = ++i + ++i + ++i + ++i;
;       
?live1@32: ; EAX = i
        inc eax
        inc eax
        inc eax
        inc eax
        lea edx,dword ptr [eax+eax]
        add edx,eax
        add eax,edx

发表于 2010-11-17 11:09 |显示全部楼层
此文章由 蓝爸爸 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 蓝爸爸 所有!转贴必须注明作者、出处和本声明,并保持内容完整
自己提个问题:以前以为gcc和Borland C编译器都是权威,现在两个做法不同,到底该认哪个?

发表于 2010-11-17 11:14 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 蓝爸爸 于 2010-11-17 11:09 发表
自己提个问题:以前以为gcc和Borland C编译器都是权威,现在两个做法不同,到底该认哪个?


选择靠近你的操作系统的编译器。比如Solaris 选择CC, Linux选择GCC/G++, Windows 选择VC
然后了解编译器的特性。还有这种代码肯定是要避免的。

发表于 2010-11-17 11:15 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
that's why ppl love c#/java, they remain consistency on different platforms.

发表于 2010-11-17 11:17 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Dude, C# only works for Windows platform, not Unix/Linux etc.
Advertisement
Advertisement

发表于 2010-11-17 11:35 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zyzbill 于 2010-11-17 11:17 发表
Dude, C# only works for Windows platform, not Unix/Linux etc.


check out mono

http://www.mono-project.com/Main_Page

发表于 2010-11-17 11:53 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Interesting stuff, good to learn.
So it's based on MS silverlight.

2010年度奖章获得者

发表于 2010-11-17 12:01 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zyzbill 于 2010-11-17 11:53 发表
Interesting stuff, good to learn.
So it's based on MS silverlight.


nah nothing to do with silverlight, they make a whole new compiler for unix.

lots of tweaks and trick in it. but they try to make the end result as close as possible.
足迹 Reader is phenomenal. If you never used, you never lived 火速下载

发表于 2010-11-17 12:13 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
It it free?

My next job will be C#, I'll be interested in it. ;)

2010年度奖章获得者

发表于 2010-11-17 12:17 |显示全部楼层
此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
yes it's open sourced.

you can write c# app once make make it run on unix.

also MS just made F# open sourced too.
Advertisement
Advertisement

发表于 2010-11-17 12:21 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 zyzbill 于 2010-11-17 12:13 发表
It it free?

My next job will be C#, I'll be interested in it. ;)


作作市场调查再作决定,很多人不稀饭mono project,尤其是open source那边的,除非非常open mind

发表于 2010-11-17 12:29 |显示全部楼层
此文章由 o2h2o 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 o2h2o 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乘物以游心 于 2010-11-17 10:26 发表
z = 10 吧?

留记号看结果。

(paopaobing(32))


发哥也是搞it的?

发表于 2010-11-17 12:30 |显示全部楼层
此文章由 o2h2o 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 o2h2o 所有!转贴必须注明作者、出处和本声明,并保持内容完整
mono 里面 少不少
library,比较杯具

发表于 2010-11-17 12:49 |显示全部楼层
此文章由 乘物以游心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乘物以游心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 o2h2o 于 2010-11-17 11:29 发表


发哥也是搞it的?


Master是学IT的,后来也做了两年,之后再也没做过IT了。。。

(paopaobing(32))
超然世外,欲乘物以游心,
逍遥驰骋,必先了悟宇宙之真谛。

退役斑竹

发表于 2010-11-17 14:03 |显示全部楼层
此文章由 大饼 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 大饼 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我看这贴不是讨论结果是多少。
是让大家知道:
不想给自己或别人惹麻烦的千万别这么写code
Advertisement
Advertisement

2010年度奖章获得者

发表于 2010-11-17 14:05 |显示全部楼层

回复 51# 的帖子

此文章由 dalaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 dalaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
是滴。

写这样code 的人要被枪毙, 这样世界就清净了。

发表于 2010-11-17 14:11 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 乱码 于 2010-11-17 12:21 发表


作作市场调查再作决定,很多人不稀饭mono project,尤其是open source那边的,除非非常open mind


No one will be that silly to do the work that way, port C# code into linux/unix. I just think it's funny.

发表于 2010-11-17 14:13 |显示全部楼层
此文章由 bulaohu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bulaohu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
任何一本编程书的第一或者第二章都会讲到这些类似的语法在不同编译器和不同系统下会造成不同的结果,我想大多数程序员的选择就是避免写这样的code出来。

发表于 2010-11-17 16:06 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不少C++面试中多出现这个考试题目,所以还真的会。

发表于 2010-11-17 20:26 |显示全部楼层
此文章由 zyzbill 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 zyzbill 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 蓝爸爸 于 2010-11-17 11:07 发表
另附上C++ Builder 6在Win7下生成的ASM,和gcc类似,也是取 i 所在地址里面的值,不过BCC更狠,是把所有++全执行完,然后做 + 运算,所以最终是 4 x 4 = 16。

;       
;        {
;            int i = 0;
;       
@1:
        xor eax,eax
;       
;            int  ...



不只C++ Builder 这么干, VC++在windows7 64 bit上执行一样的操作,返回16

; 9    :  int i = 0;

        mov        DWORD PTR _i$[ebp], 0

; 10   :  int z = ++i + ++i + ++i + ++i;

        mov        eax, DWORD PTR _i$[ebp]
        add        eax, 1
        mov        DWORD PTR _i$[ebp], eax
        mov        ecx, DWORD PTR _i$[ebp]
        add        ecx, 1
        mov        DWORD PTR _i$[ebp], ecx
        mov        edx, DWORD PTR _i$[ebp]
        add        edx, 1
        mov        DWORD PTR _i$[ebp], edx
        mov        eax, DWORD PTR _i$[ebp]
        add        eax, 1
        mov        DWORD PTR _i$[ebp], eax
        mov        ecx, DWORD PTR _i$[ebp]
        add        ecx, DWORD PTR _i$[ebp]
        add        ecx, DWORD PTR _i$[ebp]
        add        ecx, DWORD PTR _i$[ebp]
        mov        DWORD PTR _z$[ebp], ecx
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部