【例3.1】分析下面程序的輸出結果。
#include <stdio.h> void main () { double a=2 ,b=6 ; int c=2 ,d=6 ; printf ("%f\n" ,a/b ); //1 printf ("%f\n" ,2/6 ); //2 printf ("%f\n" ,2./6 ); //3 printf ("%f\n" ,(double )c/d ); //4 printf ("%f\n" ,(double )(c/d )); //5 printf ("%f\n" ,(double )(c/b )); //6 printf ("%d\n" ,2/6 ); //7 printf ("%f\n" ,c/b ); //8 }
第2條語句的「2/6」與第7條語句的「2/6」是一樣的,都是兩個整數相除,結果為0,只是第2條語句用實數輸出,為0.000000,第7條語句用整數輸出,為0。第5條輸出語句只是將整數「2/6」的結果轉換為實數,整數相除的結果為0,當然輸出與第2條語句一樣。
第6條語句對「c/b」的結果進行轉換是多餘的,因為「c/b」已經是混合運算,自動實現轉換,與第8條語句等效。第3條語句也是實數和整數的混合運算,它們的結果都與第1條語句的結果一樣,均輸出0.333333。程序的輸出為
0.333333 0.000000 0.333333 0.333333 0.000000 0.333333 0 0.333333
整型、單精度、雙精度型數據可以混合運算,字符型數據可以與整型數據通用。因此,整型、實型(包括單、雙精度)、字符型數據間可以混合運算。在進行運算時,不同類型的數據要先轉換成同一類型,然後進行運算。轉換規則是:字符型必須先轉換為整數,short型轉換為int型,float型數據在運算時一律先轉換成雙精度型;int型與double型數據進行運算,先將int型數據轉換成double型,結果為double型;同理,int型與long型數據進行運算,先將int型轉換成long型,結果為long型。
【例3.2】演示字符和整數的運算程序。
#include <stdio.h> void main () { char a='a' ; int i=97 ; printf ("%c %c %c\n" ,a ,(a+1 ),(a+2 )); printf ("%c %c %c\n" ,i ,(i+1 ),(i+2 )); printf ("%d %d %d\n" ,a ,(a+1 ),(a+2 )); }
在VC中,第1條語句與下面的語句
printf ("%c %c %c\n" ,a ,a+1 ,a+2 );
是等效的。之所以不用這種形式,是因為有的C編譯器對「a+1」和「(a+1)」的處理方式不一樣,效果也就不一樣。根據混合運算規則,可以分析出程序輸出的結果如下。
a b c a b c 97 98 99
【例3.3】分析下面程序中的錯誤。
#include <stdio.h> void main () { int a=97 ; double b=25 ; printf ("%d\n" ,a%b ); }
運算符%只適用於整數,需要對b強制轉換,即「a%(int)b」,變成97%25=22。
注意不能將形如「b=25」的b誤認為整數,它是25.000000,不符合求余的運算要求。