免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: achieverain
打印 上一主题 下一主题

简单问题,禁止运行后解答,估计很多人都会做错,更新了一下 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-10-18 01:20 |只看该作者
无论是c还是php还是其他语言,都没有对这种类型的语法进行明确的定义,关键在于表达式解释时压栈的方法和变量的处理上。这些处理方式,都是语言内部的实现方式。

如果把这种理解作为对语言的理解,那岂不是比孔乙己还要可悲。

论坛徽章:
0
32 [报告]
发表于 2007-10-18 09:22 |只看该作者
原帖由 只爱一点点 于 2007-10-17 16:29 发表


先拯救你自己吧。呵呵

你到C版问问这个等于几,肯定会告诉你6,问问他们为什么吧,我编译原理学不好,讲不清。

不是C与php在++运算符的规则、优先级规则上不一样,是在表达式解析上处理方法不同。


我疏忽了一个问题 ,正像31楼的说法一样 ,这应该属于语言内部的处理问题 .

原帖由 zjzfb 于 2007-10-17 16:01 发表

如果一个正经程序员会写这种代码才是真的应该趁早回家抱老婆了


这位的枪口歪了 ,自己先回去抱孩子吧 .

人家写什么样的代码你管得到么 ?还有请问我哪句支持写这样的代码了 ?还有这本身是一个试题性质的东西 ,考问题呢 ,扯这个干什么 ?

就像一个人谈到抱孩子而我却扯到他LP是不是处女一样可笑 .

SHIT 人家说的是抱老婆 ,而我没有 ,所以看成是抱孩子了 ,一个意思 ~~

[ 本帖最后由 笨狼追风 于 2007-10-18 09:26 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2007-10-18 09:42 |只看该作者
呼叫阿 Qiao 锁帖,路线又开始偏差,人民内部矛盾又开始激化……

论坛徽章:
0
34 [报告]
发表于 2007-10-18 12:21 |只看该作者
看看

论坛徽章:
0
35 [报告]
发表于 2007-10-18 17:49 |只看该作者

回复 #3 HonestQiao 的帖子

int main()
{
        int r=3;
        int c=0;
        c=r+++r++;
        printf("%d\n",c);
        return 1;
}
结果是6
int main()
{
        int r=3;
        int c=0;
        c=(++r)+(++r);
        printf("%d\n",c);
        return 0;
}
结果是10

很奇怪,谁熟悉C的能解释一下吗
现在已经开始怀疑我的思维了

论坛徽章:
0
36 [报告]
发表于 2007-10-18 18:52 |只看该作者
除了运算规则之外,可以看看这个

http://bbs.chinaunix.net/redirec ... 54&ptid=1002350

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
37 [报告]
发表于 2007-10-21 11:42 |只看该作者
原帖由 leicc 于 2007-10-18 17:49 发表
int main()
{
        int r=3;
        int c=0;
        c=r+++r++;
        printf("%d\n",c);
        return 1;
}
结果是6
int main()
{
        int r=3;
        int c=0;
        c=(++r) ...


实际上,这个要看不同的解析器如何来做的。

在PHP之中,目前,是这么做的:

  1. <?php

  2. settype($x,"int");

  3. {
  4.         settype($z,"int");
  5.         $x = 0;
  6.         $z = $x++ + a() + $x++ + a() + $x++ + a();
  7.         printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
  8.         $x = 0;
  9.         $z = ++$x + a() + ++$x + a() + ++$x + a();
  10.         printf("\$z=%d,\$x=%d\n\n\n", $z, $x);

  11.         $x = 0;
  12.         $z = $x-- + a() + $x-- + a() + $x-- + a();
  13.         printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
  14.         $x = 0;
  15.         $z = --$x + a() + --$x + a() + --$x + a();
  16.         printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
  17.         return 0;
  18. }

  19. function a()
  20. {
  21.         static $y=0;
  22.         global $x;
  23.         printf("\$x=%d,\$y=%d\n", $x, $y);
  24.         $y++ ;
  25.         return 0;
  26. }
  27. ?>
复制代码


结果:

  1. ---------- PHP代码调试(CLI) ----------
  2. $x=1,$y=0
  3. $x=2,$y=1
  4. $x=3,$y=2
  5. $z=3,$x=3


  6. $x=1,$y=3
  7. $x=2,$y=4
  8. $x=3,$y=5
  9. $z=6,$x=3


  10. $x=-1,$y=6
  11. $x=-2,$y=7
  12. $x=-3,$y=8
  13. $z=-3,$x=-3


  14. $x=-1,$y=9
  15. $x=-2,$y=10
  16. $x=-3,$y=11
  17. $z=-6,$x=-3



  18. 输出完成 (耗时 0 秒) - 正常终止
复制代码



而C语言是编译型的,那么就要看编译器对这个如何进行编译和优化了。
WinXP SP2的VC6++这么做的:

  1. #include "stdafx.h"
  2. #include "stdio.h"
  3. int x;
  4. int a();
  5. int main(int argc, char* argv[])
  6. {
  7.         int z;
  8.         x = 0;
  9.         z = x++ + a() + x++ + a() + x++ + a();
  10.         printf("z=%d,x=%d\n\n\n", z, x);
  11.         x = 0;
  12.         z = ++x + a() + ++x + a() + ++x + a();
  13.         printf("z=%d,x=%d\n\n\n", z, x);

  14.         x = 0;
  15.         z = x-- + a() + x-- + a() + x-- + a();
  16.         printf("z=%d,x=%d\n\n\n", z, x);
  17.         x = 0;
  18.         z = --x + a() + --x + a() + --x + a();
  19.         printf("z=%d,x=%d\n\n\n", z, x);
  20.         return 0;
  21. }

  22. int a()
  23. {
  24.         static int y=0;
  25.         printf("x=%d,y=%d\n",x,y);
  26.         y++ ;
  27.         return 0;
  28. }
复制代码


结果:

  1. x=0,y=0
  2. x=0,y=1
  3. x=0,y=2
  4. z=0,x=3


  5. x=1,y=3
  6. x=2,y=4
  7. x=3,y=5
  8. z=6,x=3


  9. x=0,y=6
  10. x=0,y=7
  11. x=0,y=8
  12. z=0,x=-3


  13. x=-1,y=9
  14. x=-2,y=10
  15. x=-3,y=11
  16. z=-6,x=-3
复制代码


以下是FreeBSD的结果:
%gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305



  1. #include "stdio.h"
  2. int x;
  3. int a();
  4. int main(int argc, char* argv[])
  5. {
  6.         int z;
  7.         x = 0;
  8.         z = x++ + a() + x++ + a() + x++ + a();
  9.         printf("z=%d,x=%d\n\n\n", z, x);
  10.         x = 0;
  11.         z = ++x + a() + ++x + a() + ++x + a();
  12.         printf("z=%d,x=%d\n\n\n", z, x);

  13.         x = 0;
  14.         z = x-- + a() + x-- + a() + x-- + a();
  15.         printf("z=%d,x=%d\n\n\n", z, x);
  16.         x = 0;
  17.         z = --x + a() + --x + a() + --x + a();
  18.         printf("z=%d,x=%d\n\n\n", z, x);
  19.         return 0;
  20. }

  21. int a()
  22. {
  23.         static int y=0;
  24.         printf("x=%d,y=%d\n",x,y);
  25.         y++ ;
  26.         return 0;
  27. }

复制代码

结果却是:

  1. x=1,y=0
  2. x=2,y=1
  3. x=3,y=2
  4. z=3,x=3


  5. x=1,y=3
  6. x=2,y=4
  7. x=3,y=5
  8. z=6,x=3


  9. x=-1,y=6
  10. x=-2,y=7
  11. x=-3,y=8
  12. z=-3,x=-3


  13. x=-1,y=9
  14. x=-2,y=10
  15. x=-3,y=11
  16. z=-6,x=-3
复制代码


Linux上面:
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)

结果与FreeBSD完全相同

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
38 [报告]
发表于 2007-10-22 09:39 |只看该作者
7
$c++ :先参加本次运算,然后自身加一
++$c :先自身加一,然后参加本次运算

论坛徽章:
0
39 [报告]
发表于 2007-10-22 17:36 |只看该作者
到底答案是什么啊

论坛徽章:
0
40 [报告]
发表于 2007-10-22 18:16 |只看该作者

回复 #38 HonestQiao 的帖子

多谢乔楚的回复
a()验证的只是
$c++ :先参加本次运算,然后自身加一
++$c :先自身加一,然后参加本次运算


现在还是不明白为什么出现的是那样的结果,由于编译器不一样导致结果不一样,那到底编译器是怎么不一样了呢?

呵呵,好像有点贪得无厌了

[ 本帖最后由 leicc 于 2007-10-22 18:17 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP