- 论坛徽章:
- 1
|
原帖由 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之中,目前,是这么做的:
- <?php
- settype($x,"int");
- {
- settype($z,"int");
- $x = 0;
- $z = $x++ + a() + $x++ + a() + $x++ + a();
- printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
- $x = 0;
- $z = ++$x + a() + ++$x + a() + ++$x + a();
- printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
- $x = 0;
- $z = $x-- + a() + $x-- + a() + $x-- + a();
- printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
- $x = 0;
- $z = --$x + a() + --$x + a() + --$x + a();
- printf("\$z=%d,\$x=%d\n\n\n", $z, $x);
- return 0;
- }
- function a()
- {
- static $y=0;
- global $x;
- printf("\$x=%d,\$y=%d\n", $x, $y);
- $y++ ;
- return 0;
- }
- ?>
复制代码
结果:
- ---------- PHP代码调试(CLI) ----------
- $x=1,$y=0
- $x=2,$y=1
- $x=3,$y=2
- $z=3,$x=3
- $x=1,$y=3
- $x=2,$y=4
- $x=3,$y=5
- $z=6,$x=3
- $x=-1,$y=6
- $x=-2,$y=7
- $x=-3,$y=8
- $z=-3,$x=-3
- $x=-1,$y=9
- $x=-2,$y=10
- $x=-3,$y=11
- $z=-6,$x=-3
- 输出完成 (耗时 0 秒) - 正常终止
复制代码
而C语言是编译型的,那么就要看编译器对这个如何进行编译和优化了。
WinXP SP2的VC6++这么做的:
- #include "stdafx.h"
- #include "stdio.h"
- int x;
- int a();
- int main(int argc, char* argv[])
- {
- int z;
- x = 0;
- z = x++ + a() + x++ + a() + x++ + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = ++x + a() + ++x + a() + ++x + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = x-- + a() + x-- + a() + x-- + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = --x + a() + --x + a() + --x + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- return 0;
- }
- int a()
- {
- static int y=0;
- printf("x=%d,y=%d\n",x,y);
- y++ ;
- return 0;
- }
复制代码
结果:
- x=0,y=0
- x=0,y=1
- x=0,y=2
- z=0,x=3
- x=1,y=3
- x=2,y=4
- x=3,y=5
- z=6,x=3
- x=0,y=6
- x=0,y=7
- x=0,y=8
- z=0,x=-3
- x=-1,y=9
- x=-2,y=10
- x=-3,y=11
- 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
- #include "stdio.h"
- int x;
- int a();
- int main(int argc, char* argv[])
- {
- int z;
- x = 0;
- z = x++ + a() + x++ + a() + x++ + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = ++x + a() + ++x + a() + ++x + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = x-- + a() + x-- + a() + x-- + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- x = 0;
- z = --x + a() + --x + a() + --x + a();
- printf("z=%d,x=%d\n\n\n", z, x);
- return 0;
- }
- int a()
- {
- static int y=0;
- printf("x=%d,y=%d\n",x,y);
- y++ ;
- return 0;
- }
复制代码
结果却是:
- x=1,y=0
- x=2,y=1
- x=3,y=2
- z=3,x=3
-
-
- x=1,y=3
- x=2,y=4
- x=3,y=5
- z=6,x=3
-
-
- x=-1,y=6
- x=-2,y=7
- x=-3,y=8
- z=-3,x=-3
-
-
- x=-1,y=9
- x=-2,y=10
- x=-3,y=11
- 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完全相同 |
|