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