3.4 注意编译系统的差别

【例3.7】程序的运行结果取决于编译系统的例子。


#include  <stdio.h>
void main
()
{
       int a=65135
;
       double i=8256.67
;
       a=
(int
)i+a
;
       printf
("\n%d
,%f"
,a
,i
);
}
  

如果使用VC,输出结果为“73391,8256.670000”。如果使用Borland C++,则输出为“7855,8256.670000”。这是因为前者为int分配4个字节;后者为int分配2个字节,结果a=-401,变成了8256-401=7855。如果将声明改为


long a=65135
;
  

对VC来说,并没有影响。但对Borland C++来说,虽然计算结果对了,但输出函数printf的参数不匹配,仍然得不到正确结果。如果将它改为格式


printf
("\n%ld
,%f"
,a
,i
);
  

则Borland C++也能得到正确结果。

由此可见,编程时还要考虑自己的使用环境,不能生搬硬套。

写程序时,也要注意不同编译系统的区别。

【例3.8】运行结果取决于编译系统的例子。


#include <stdio.h>
void main
()
{
     int m=5
;
     printf
("\n%d
,%d"
,m
,m++
);
}
  

这个程序使用m的方式会产生歧义。因为在调用函数时,C标准并没有规定实参数的求值顺序。m和m++是两个表达式的值。VC是自左而右求值,先使用m,然后自增1,所以输出是“5,5”;Borland C++是自右而左求值,第一个m为5,但它使用之后变为6,将6作为第二个m值,所以输出是“6,5”。

在编程时,应避免使用可能产生歧义的语句,更不要写别人看不懂,也不知道系统如何执行的程序。尤其是使用“++”和“--”时,更要小心。

《C语言解惑》