又一个TC与VC的截然不同:
#include
main(){
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
getch(); }
winTC输出结果:15,24,8,8
VC 6.0输出结果:15,22,8,8
谁能告诉我这到底是怎么回事啊?!真叫人无语!
这都是C语言,不同的编译器对于同一个程序(而且还是如此简单、如此基本的程序!!)却有不同的结果!我都不知道该相信哪个了,这岂不是
意味着我要用不同的编译器,还要去重新学习一遍C语言了?!
VC60默认编译器选项是这样的,为了优化代码的执行效率,在同一表达式连续累加的时候保持原值静态不变。你可以根据需要选择不同的编译
选项。
不单是VC60,包括GNU DEV
C++、G++等任何一种现代编译器,都在优化代码、优化地址空间上大做文章。你如果感兴趣,可以学习ANSI C为基
础标准,每种编译器对ANSI C的实现是不一样的,即使是GNU C++,那么标准化的程序,也只实现ANSI
C的97%语法标准。
对于上面的问题,有很多种解决方法:
1、不要尝试用一些很含混晦涩、不易阅读和书写的表达式,尽量以ANSI C语法为标准写;
2、如果要使用编译器特殊优化功能,请学会使用预定义和预编译选项,比如内存对齐、库函数调用:
#ifdef WIN32
#pragma pack(1)
#include
#else
#include
#endif
这样上面的代码就可以在WINDOWS和LINUX之间兼容编译畅通无阻。
这些内容在现代C语言都很常见的,真的没什么大惊小怪。要怪就怪老师本身对现代编译器内容很少介绍,而且也太图省事,只把垃圾一样的
TURBO C捧为经典。要知道TC是20年前的DOS产品,把所有问题归咎于古董而过于依赖是不对的。
虽然懒惰的老师们都应该被拖出去打屁股,但是聪明的学生应该懂得考试的时候怎么办,挣钱的时候又该怎么办。