讀古今文學網 > C語言解惑 > 3.4 注意編譯系統的差別 >

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」。

在編程時,應避免使用可能產生歧義的語句,更不要寫別人看不懂,也不知道系統如何執行的程序。尤其是使用「++」和「--」時,更要小心。