官术网_书友最值得收藏!

2.6 不同數(shù)據(jù)類型之間的轉(zhuǎn)換

學(xué)習(xí)提示

【理解】數(shù)據(jù)的自動轉(zhuǎn)換和強制轉(zhuǎn)換

如果一個運算符兩邊的運算數(shù)類型不同,那么,要先將其轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運算,此過程由編譯系統(tǒng)自動完成。這種轉(zhuǎn)換又可以分為兩種不同的情況。

① 當運算符兩邊是不同精度同一種數(shù)據(jù)類型時,編譯器進行同一類型間的轉(zhuǎn)換。

例如

   floata;

   floatb;

   doublec;

   c=a+b ;

說明

這時進行的就是浮點型之間的轉(zhuǎn)換。雖然它們類型相同,但仍要先轉(zhuǎn)成double型,再進行運算,結(jié)果也為double型(注意:在VC6.0中,所有的float類型數(shù)據(jù)在運算中都自動轉(zhuǎn)換成double型數(shù)據(jù))。所以對于浮點型數(shù)據(jù)的轉(zhuǎn)換方向可以描述為:

float->double

這表示float類型向double類型的轉(zhuǎn)換。同樣也可以將整型數(shù)據(jù)之間的轉(zhuǎn)換方向描述為:

int->long

即如果一個long型數(shù)據(jù)與一個 int型數(shù)據(jù)一起運算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型數(shù)據(jù),然后兩者再進行運算,結(jié)果為long型數(shù)據(jù)。

② 參與運算的運算數(shù)類型不同,則先將它們轉(zhuǎn)換成同一種類型,然后進行運算。轉(zhuǎn)換方向可以描述為:

int->double(float)

即當整型數(shù)據(jù)與浮點型數(shù)據(jù)進行運算時,往往是整型數(shù)據(jù)向浮點型數(shù)據(jù)轉(zhuǎn)換。

在賦值運算中,賦值號兩邊運算數(shù)的數(shù)據(jù)類型不同時,賦值號右邊運算數(shù)的類型將轉(zhuǎn)換為左邊運算數(shù)的類型。

【例2-5】根據(jù)圓的半徑求圓的面積。

程序代碼

#include<stdio.h>

void main( )

{ float pi=3.14;/*定義一個浮點型變量并初始化*/

 int s,r=5;/*定義兩個整型變量,分別表示圓的半徑和面積*/

 s=r*r*pi;/*求圓的面積*/

 printf("s=%d\n",s);

/*輸出圓的面積*/

分析一下本程序的輸出結(jié)果的類型。

●pi為浮點型數(shù)據(jù),s、r為整型數(shù)據(jù)。

●在執(zhí)行 s=r*r*pi;語句時,r和 pi都轉(zhuǎn)換成實型進行計算,結(jié)果仍為實型。

●由于s為整型,因此賦值結(jié)果仍為整型,會舍去小數(shù)部分。

所有這些轉(zhuǎn)換都是由系統(tǒng)自動進行的,使用時只需從中了解結(jié)果的類型即可。

另一方面,C語言也提供了強制類型轉(zhuǎn)換的機制,其一般形式為:

(類型說明符)(表達式 )

說明

這種類型轉(zhuǎn)換的效果是把表達式的類型強制轉(zhuǎn)換為要求的類型,而不管類型的高低。其中,“類型說明符”指明了要求轉(zhuǎn)換的目標類型;“表達式”指明了要強制轉(zhuǎn)換的表達式。

需轉(zhuǎn)換的表達式如果不是單個的變量,則要用括號將其括起來,如(int)(x+y)與(int)x+y是不同的,后者相當于(int)(x)+y,也就是說,只將 x轉(zhuǎn)換成整型,然后與y相加。無論是強制轉(zhuǎn)換或是自動轉(zhuǎn)換,都不會改變數(shù)據(jù)說明時對該變量定義的類型。

例如

   (double)a

   (int)(x+y)

前者是將a轉(zhuǎn)換成double型,而不管a先前是什么類型的數(shù)據(jù)。后者的效果是將x+y的結(jié)果轉(zhuǎn)換為 int型,不論 x和 y是何種類型的數(shù)據(jù)。

請注意

①字符型數(shù)據(jù)向整型數(shù)據(jù)轉(zhuǎn)換時,實質(zhì)上是將字符型數(shù)據(jù)轉(zhuǎn)換成與該字符對應(yīng)的十進制ASCII碼值。

②在進行賦值運算時,實質(zhì)上是將運算符右邊的數(shù)據(jù)類型強制轉(zhuǎn)換成運算符左邊的數(shù)據(jù)類型。

【例2-6】強制類型轉(zhuǎn)換。

程序代碼

#include<stdio.h>

void main( )

{float f=1.2345;/*定義一個浮點型變量f,并初始化為1.2345*/

 int a;/*定義一個整型變量*/

 a=(int)f;

/*將浮點型變量強制轉(zhuǎn)化為整型值*/

 printf("a=%d,f=%f\n",a,f);

/*輸出整型變量a和浮點型變量f的值*/

本程序的輸出結(jié)果是:

   a=1,f=1.234500

分析程序可知:

① 本例中首先將 f強制轉(zhuǎn)換成 int類型,然后賦值給變量a,所以a的值是1;

② f雖然強制轉(zhuǎn)為int型,但只在運算中起作用,而f本身的類型并不改變,f的值仍為1.2345。

真題演練

【例1】有以下程序:

#include<stdio.h>

#include<math.h>

main( )

{ inta=1,b=4,c=2;

 doublex=10.5,y=4.0,z;

 z=(a+b)/c+sqrt(y)*1.2/c+x;printf("%f\n",z);

程序運行后的輸出結(jié)果是(  )

A)13.700000

B)14.000000

C)15.400000

D)14.900000

【解析】如果一個運算符兩邊的運算數(shù)類型不同,要先將其轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運算。程序執(zhí)行過程為:a+b=5,5/2=2(int類型),sqrt(y)=2.0(double類型),2.0*1.2/2=1.2(double類型),z=2.0(由int類型自動轉(zhuǎn)換成double類型)+1.2+10.5=13.7。因此A選項正確。

【答案】A

【例2】若有以下程序段:

doublex=5.16894;

printf("% f\n",(int)(x*1000+0.5)/(double)1000);

則程序段的輸出結(jié)果是( )

A)5.170000    B)5.175000

C)5.169000    D)5.168000

【解析】%f的輸出格式是以帶小數(shù)點的數(shù)學(xué)形式輸出浮點數(shù)。首先計算x*1000,結(jié)果為5168.94,然后該結(jié)果加0.5,結(jié)果為5169.44,然后進行強制類型轉(zhuǎn)換,轉(zhuǎn)換成整型為5169,再除以雙精度數(shù)據(jù)1000,結(jié)果也為雙精度數(shù)據(jù)5.169,輸出時按照%f的格式輸出,所以輸出結(jié)果為5.169000。

【答案】C

【例3】若在程序中變量均已定義成int類型,且已賦大于1的值,則下列選項中能正確表示代數(shù)式的表達式是( )

A)1.0/a/b/c

B)1/(a*b*c)

C)1.0/a*b*c

D)1/a/b/(double)c

【解析】由于a、b、c均大于1,所以表達式1/abc小于1,需要用浮點類型表示。若要計算表達式值,需要使其自動轉(zhuǎn)化成浮點類型,所以 A選項正確。B選項由于變量與常量均為整型,不會自動轉(zhuǎn)換為浮點類型,所以B選項錯誤。C選項表示表達式bc/a,故錯誤。D選項,由于算數(shù)運算法結(jié)合性自左向右,先計算1/a,結(jié)果為0,之后的計算無論是否轉(zhuǎn)換數(shù)據(jù)類型結(jié)果均為0,所以D選項錯誤。

【答案】A

主站蜘蛛池模板: 武穴市| 叙永县| 突泉县| 延边| 清新县| 军事| 铁岭市| 神木县| 依兰县| 华安县| 海伦市| 砚山县| 寿宁县| 武陟县| 麟游县| 海晏县| 武川县| 万荣县| 迭部县| 武强县| 改则县| 阳泉市| 雷波县| 邓州市| 开原市| 玛曲县| 枞阳县| 长海县| 禄丰县| 保定市| 申扎县| 福贡县| 广昌县| 广河县| 富源县| 泸定县| 望都县| 凭祥市| 犍为县| 靖边县| 普洱|