結(jié)構(gòu)型、共用型和枚舉型典型例題分析與解答

字號:

1 設(shè)有下列定義語句,則表達式“p->x「l」”的值是_____________;表達式“(*p).k”的值是____________。
     struct { int x[5];
     int k;
     } s={{1,2},3},*p=&s;
    【分析】p是指向結(jié)構(gòu)型變量s的結(jié)構(gòu)型指針變量,所以“p->成員名”就是結(jié)構(gòu)型變量s的成員。由于表達式中給出的成員是數(shù)組元素x[1],所以該表達式的值就是x[1]的值。從賦初值來看,這個數(shù)組元素的初值為2,所以第一個空白應該填寫2。同樣道理,*p就是p指向的結(jié)構(gòu)型變量s,所以第二個表達式就是s.k,k是結(jié)構(gòu)型變量S的成員,初值為3,所以第二個表達式的值為3。
    【答案】2
     3
    2 設(shè)有下列定義語句,則下列表達式中能表示結(jié)構(gòu)型xx的成員x的表達式是()
     struct xx{ int x;};
     struct yy { struct xx xxx;int yy;} xxyy;
     ① xxyy.x ② xxyy->x ③(&xxyy)->xxx.x ④xxx.x
    【分析】分析備選答案①:xxyy是結(jié)構(gòu)型yy的變量,其后跟“.成員”是正確的,但是這個成員必須是結(jié)構(gòu)型yy的成員,而表達式中的“x”是結(jié)構(gòu)型xx的成員,所以是錯誤的。分析備選答案②:xxyy是結(jié)構(gòu)型變量,其后不能跟“->”,這樣會造成語法錯誤。分析備選答案③:&xxyy是結(jié)構(gòu)型變量xxyy的地址,其后跟“->成員”是正確的,表示該結(jié)構(gòu)型
    的成員,這個成員是結(jié)構(gòu)型對的成員xxx,而這個成員的數(shù)據(jù)類型又是另一個結(jié)構(gòu)型xx,所以其后應該是“.xx的成員”,表達式中恰好是xx的成員x,所以這個表達式是正確的(注意,這是嵌套結(jié)構(gòu)型成員的弓l用格式)。至于備選答案④:xxx是結(jié)構(gòu)型成員,不能直接引用,前面必須有結(jié)構(gòu)型變量或結(jié)構(gòu)型數(shù)組元素。
    【答案】③
    3 設(shè)有下列定義語句,則表達式“(*(p+1)).name[1]”的值是______________;表達式“(p+1)-> score[1]”的值是_____________。
     struct { long num;char name[10」;float score[3];
     }s[2」={{101L,"zhao",{90,80,70}},{102L,"qian",{75,65,55}}},*p=s;
    【分析】指針變量 p是指向結(jié)構(gòu)型數(shù)組 S的首地址,所以 p+ 1就是數(shù)組元素 s[1]的地址,因此,*(p+ l)就是 s[1],這是一個結(jié)構(gòu)型數(shù)組元素,其后跟“.name[1]”,則代表結(jié)構(gòu)型成員,所以第一個空白處應該填寫的是結(jié)構(gòu)型成員name數(shù)組的元素name[1]的值,從賦初值的情況來看,這個值是字符‘i’。再來分析第二個表達式, p+ l是結(jié)構(gòu)型數(shù)
    組s的元素s[1]的地址,在地址后面跟“->score[1]”也是代表結(jié)構(gòu)型成員,因此第二個空白處填寫的是結(jié)構(gòu)型成員score數(shù)組的元素score[l]的值,這個值顯然是65.0。
    【答案】'i'
     65.0
    4 關(guān)于獲得系統(tǒng)日期函數(shù)(getdate())和獲得系統(tǒng)時間(gettime())的函數(shù),下列說法中錯誤的是()
    ①需要在程序的開頭寫上相關(guān)的包含命令
    ②如果需要通過getdate()函數(shù)獲得系統(tǒng)日期,必須定義一個 struct date型的變量
    ③如果需要通過gettime()函數(shù)獲得系統(tǒng)時間,必須定義一個 struct time型的變量和一個struct time型的指針變量
    ④getdate()函數(shù)和gettime()函數(shù)均無返回值
    【分析】分析備選答案①:顯然是正確的說法,使用任何系統(tǒng)函數(shù)都要寫上包含該函數(shù)的包含命令。分析備選答案②:因為調(diào)用getdat()函數(shù)時,需要一個能接受系統(tǒng)日期的結(jié)構(gòu)型 struct date的變量,雖然該函數(shù)的參數(shù)是指向該種結(jié)構(gòu)型的指針變量,但是我們可以用“&結(jié)構(gòu)型變量名”作為實際參數(shù),所以本答案的說法也是正確的。分析備選答案③:和備選答案②類似,從gettime()函數(shù)的調(diào)用要求來說,也需要一個能存放系統(tǒng)時間的 struct tine結(jié)構(gòu)型的變量,雖然調(diào)用函數(shù)時需要的是指針變量,但是可以用“&結(jié)構(gòu)型變量名”來調(diào)用,并不一定需要同時有結(jié)構(gòu)型變量和結(jié)構(gòu)型指針變量,所以該說法是錯誤的,符合題意。至于備選答案④:教材中明確指出,這兩個系統(tǒng)函數(shù)均無返回值。
    【答案】 ③
    5 設(shè)有下列定義語句,則表達式“sizeof(union uu)”的值是___________;表達式“size-of((&uu1)->x[5])”的值是_________________。
     union uu { short x[10]; char s[10]; float x10;}uu1;
    【分析】sizeof()函數(shù)的參數(shù)可以是數(shù)據(jù)類型符,也可以是已經(jīng)定義的變量、數(shù)組元素等對象。該函數(shù)的返回值是測試對象所占用的內(nèi)存字節(jié)數(shù)。對于第一個表達式來說,測試對象是共用型“union un”。對于共用型來說,所占用的字節(jié)數(shù)是共用型成員中占用字書數(shù)最多的成員所占用的字節(jié)數(shù)。共用型union uu的三個成員占用的字節(jié)數(shù)分別為20、10、4,所以該表達式的值是20。第二個表達式測試的是共用型uu的變量uul的成員x數(shù)組元素x[5」所占用的字節(jié)數(shù),這個成員的數(shù)據(jù)類型是短整型,所以每個數(shù)組元素占用的字節(jié)數(shù)是2,即該表達式的值為2。
    【答案】 20
     2
    6 設(shè)有下列定義語句:
     enum { A=65,B=67, C=69}abc;
    則關(guān)于循環(huán)語句“for(abc=A;abc<C;abc++);”的正確說法是()
     ①語法出錯 ②死循環(huán) ③循環(huán)次數(shù)是4 ④循環(huán)次數(shù)是2
    【分析】由于A、B、C是枚舉常量,所以可以用在循環(huán)語句中作為控制變量來控制循環(huán)。分析備選答案①:顯然這個答案是錯誤的,上述循環(huán)語句的語法是正確的。注意循環(huán)體是一個空語句,這是允許的。分析備選答案②、③、④,關(guān)鍵是搞清楚這個循環(huán)到底執(zhí)行多少次。分析這個問題時,有一個原則,即使用枚舉型變量時,進行++運算是加上整數(shù)1,還是將定義枚舉型時,枚舉常量表中的后一個枚舉常量值放到這個枚舉變量中,答案是前者。掌握了這個原則,就可以來分析循環(huán)到底執(zhí)行多少次?首先,枚舉型變量abc是等于枚舉常量A的值(為整數(shù)65),控制循環(huán)的條件是“abc<C”,此時枚舉常量C的值是 69,條件成立,執(zhí)行循環(huán)體一次,再執(zhí)行“abc++”,此時枚舉變量abc的值不是枚舉常量B(其值為67),而是在原值65的基礎(chǔ)上加上整數(shù)