讀古今文學網 > C語言解惑 > 3.1 混合運算要小心 >

3.1 混合運算要小心

【例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,不符合求余的運算要求。