免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
1 [报告]
发表于 2007-10-15 21:14 |显示全部楼层
原帖由 achieverain 于 2007-10-15 20:54 发表
$r=3;
$c=($r++)+($r++);
请问$C值是多少? 先选择答案,然后自己运行后看正确答案


游客,如果您要查看本帖隐藏内容请回复

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
2 [报告]
发表于 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完全相同
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP