mathe 发表于 2010-9-17 14:55:35

测试c99编译功能


#include <stdio.h>

int swap_words(int x)
{
    short *p = (short *)&x;
    short a=p,b=p;
    p=b;p=a;
    return x;
}

int main()
{
    printf("%d\n",swap_words(1));
}
这个代码在gcc中用-O2或-O3编译,运行结果是1。但是如果用-O1,结果是65536.
大家可以用自己机器的编译器测试一下看看。
另外,如果short*全部改成char*,就看不到这种现象了

wayne 发表于 2010-9-17 20:03:35

1# mathe
我没有加优化,运行结果有好多的2,:Q:


C:\Users\Lenovo\Desktop>gcc test.c

C:\Users\Lenovo\Desktop>a
2228225

C:\Users\Lenovo\Desktop>gcc -O1 test.c

C:\Users\Lenovo\Desktop>a
1

C:\Users\Lenovo\Desktop>gcc -O2 test.c

C:\Users\Lenovo\Desktop>a
0

C:\Users\Lenovo\Desktop>gcc -O3 test.c

C:\Users\Lenovo\Desktop>a
0

C:\Users\Lenovo\Desktop>

wayne 发表于 2010-9-17 20:07:32

把所有的short 替换成char以后,没加O 的,运行结果变了,是2293505,加了O之后,结果跟上面的一样

mathe 发表于 2010-9-18 08:00:30

呵呵,你的编译器版本多少,结果有点奇怪,
如果结果是1,65536,65537都好解释。要不然你看一下汇编代码

gxqcn 发表于 2010-9-18 08:12:28

存成.c文件编译,警报:warning C4716: 'swap_words' : must return a value

在 VC6 下,Debug版(/Od):1179648
在 VC6 下,Release版(/O1 或 /O2):2009274936

mathe 发表于 2010-9-18 09:23:25

是我在swapword函数最后忘了return x;了

gxqcn 发表于 2010-9-18 09:33:06

加上后,在 VC6 下就都是 65536 了。

mathe 发表于 2010-9-18 09:46:10

vc6有点旧了

g99 发表于 2010-9-19 09:24:19

这跟编译器应该没有关系,在32位机器上应该结果都是一样的

无心人 发表于 2010-9-19 21:13:15

最近尝试的最小的图形化的操作系统是128M内存急速运行
当然别启动浏览器

郭,有兴趣用虚拟机虚拟个,可以获得原生的gcc支持
这个系统叫AntiX
页: [1] 2
查看完整版本: 测试c99编译功能