C/C++經典程序

1.輸出結果比較

1)image

輸出結果:21

2)image

輸出結果:12。雖然循環只進行了一次,但是對!X++來說,X還是進行了自加運算。

2.指針運算

image

輸出結果8,8.程序運行時,printf語句是從右往左進行讀取,此時ptr指向8.因爲*和++的優先級相同,結合順序是從右到左,所以*ptr++等價於*(ptr++)。

3.運算符優先級

image

4.利用位運算實現兩個整數的加法運算,請用代碼實現

image

5.給三個整數a、b、c,函數實現取三個數的中間數,不可以使用sort,整數操作
儘可能少。

image

6.如何將a、b的值進行交換,並且不使用任何中間變量?

image

按位異或,不用擔心超界。

7.下面的switch語句輸出什麼。

image

不考慮break和default,從c開始執行到結束。輸出cd。

8.下面代碼輸出結果是多少?

image

解析:宏的那句被預處理器替換成了:*&array[5]-4=6;運算結果2=6;
由於減號比賦值優先級高,因此先處理減號;由於減號返回一個數而不是合法的值,所
以編譯報錯。
答案:程序可以正確編譯,但是運行時會崩潰

8.1.在簡單宏定義的使用中,當替換文本所表示的字符串爲一個表達式時,容易引起誤解和誤用。如下例:
例1   #define   N   2+2
void main()
{
   int   a=N*N;
   printf(“%d”,a);
}

輸出爲8. a=2+2*2+2=8.

9.寫一個“標準”宏MIN,這個宏輸入兩個參數並返回較小的一個。

image

10.下面哪一個const是多餘的?

image

本題中,選項A修飾函數返回值,表示返回的是指針所指向字節型值是常量;選項B的const這
樣的函數是常成員函數。常成員函數可以理解爲是一個“只讀”函數,它既不能更改數據成員
的值,也不能調用那些能引起數據成員值變化的成員函數,只能調用const成員函數,把不會
修改數據成員的函數GetBuffer聲明爲const類型。這大大提高了程序的健壯性。D是多餘的,因爲const修飾的指針在定義時需要初始化。注:(const int*a等價於int const *a).

11.const與#define相比有什麼不同?

C++語言可以用const定義常量,也可以用#define定義常量,但是前者比後者有更
多的優點:
● const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢
查,而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換中可能會產生意料不到
的錯誤(邊際效應)。
● 有些集成化的調試工具可以對const常量進行調試,但是不能對宏常量進行調試。在
C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

12.sizeof的用法。

image image

輸出結果爲4,11,100,400,4,3,4,6,8,4,4,。 size(*q3)的結果爲1,a是第一個字母。

ss1是一個字符指針,指針的大小是一個定值,就是4字節,所以sizeof(ss1)是4字節。

ss2是一個字符數組,這個數組最初未定大小,由具體填充值來定。填充值是“0123456789”。1個字符所佔空間是1字節,10個就是10字節,再加上隱含的“\0”,所以一共是11字節。

ss3也是一個字符數組,這個數組開始預分配100,所以它的大小一共是100字節。
ss4也是一個整型數組,這個數組開始預分配100,但每個整型變量所佔空間是4,所以
它的大小一共是400字節。
q1與ss2類似,所以是4字節。
q2裏面有一個“\n”,“\n”算做一位,所以它的空間大小是3字節。
q3是一個字符指針,指針的大小是一個定值,就是4,所以sizeof(q3)是4字節。
A和B是兩個結構體。在默認情況下,爲了方便對結構體內元素的訪問和管理,當結構
體內的元素的長度都小於處理器的位數的時候,便以結構體裏面最長的數據元素爲對齊單
位,也就是說,結構體的長度一定是最長的數據元素的整數倍。如果結構體內存在長度大於
處理器位數的元素,那麼就以處理器的位數爲對齊單位。但是結構體內類型相同的連續元素
將在連續的空間內,和數組一樣。
結構體A中有3個short類型變量,各自以2字節對齊,結構體對齊參數按默認的8字節對
齊,則a1、a2、a3都取2字節對齊,sizeof(A)爲6,其也是2的整數倍。B中a1爲4字節對齊,a2
爲2字節對齊,結構體默認對齊參數爲8,則a1取4字節對齊,a2取2字節對齊;結構體大小爲
6字節,6不爲4的整數倍,補空字節,增到8時,符合所有條件,則sizeof(B)爲8。

13.sizeof用法2.

image

輸出結果:答案:4,8,8,12,24。

因爲靜態變量是存放在全局數據區的,而sizeof計算棧中分配的大小,是不會計
算在內的,所以sizeof(A1)是4。
● 爲了照顧數據對齊,int大小爲4,char大小爲1,所以sizeof(A2)是8。
● 爲了照顧數據對齊,float大小爲4,char大小爲1,所以sizeof(A3)是8。
● 爲了照顧數據對齊,float大小爲4,int大小爲4,char大小爲1,所以sizeof(A4)是12。
● 爲了照顧數據對齊,double大小爲8,float大小爲4,int大小爲4,char大小爲1,所以
sizeof(A5)是32。

14.說明sizeof和strlen之間的區別。

image

sizeof(ss)結果爲400,ss表示在內存中的大小,100×4。
strlen(ss)錯誤,strlen的參數只能是char*,且必須是以“\0”結尾的。

image

cout<<sizeof(X)<<endl;結果爲12,內存補齊。
cout<<sizeof(x)<<endl;結果爲12,理由同上。

通過對sizeof與strlen的深入理解,得出兩者區別如下:
(1)sizeof操作符的結果類型是size_t,它在頭文件中的typedef爲unsigned int類型。該類
型保證能容納實現所建立的最大對象的字節大小。
(2)sizeof是運算符,strlen是函數。
(3)sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以“\0”結尾的。
sizeof還可以用函數做參數,比如:

image

輸出的結果是sizeof(short),即2。
(4)數組做sizeof的參數不退化,傳遞給strlen就退化爲指針。
(5)大部分編譯程序在編譯的時候就把sizeof計算過了,是類型或是變量的長度。image

(6)strlen的結果要在運行的時候才能計算出來,用來計算字符串的長度,而不是類型
佔內存的大小。
(7)sizeof後如果是類型必須加括號,如果是變量名可以不加括號。這是因爲sizeof是
個操作符而不是個函數。
(8)當使用了一個結構類型或變量時,sizeof返回實際的大小。當使用一靜態的空間數
組時,sizeof返回全部數組的尺寸。sizeof操作符不能返回被動態分配的數組或外部的數組的
尺寸。
(9)數組作爲參數傳給函數時傳的是指針而不是數組,傳遞的是數組的首地址,如
fun(char [8])、fun(char [])都等價於fun(char *)。

(10)計算結構變量的大小就必須討論數據對齊問題。爲了使CPU存取的速度最快(這
同CPU取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),C++在處理數據時
經常把結構變量中的成員的大小按照4或8的倍數計算,這就叫數據對齊(data alignment)。
這樣做可能會浪費一些內存,但在理論上CPU速度快了。當然,這樣的設置會在讀寫一些別
的應用程序生成的數據文件或交換數據時帶來不便。MS VC++中的對齊設定,有時候sizeof
得到的與實際不等。一般在VC++中加上#pragma pack(n)的設定即可。或者如果要按字節存
儲,而不進行數據對齊,可以在Options對話框中修改Advanced Compiler選項卡中的“Data
Alignment”爲按字節對齊。
(11)sizeof操作符不能用於函數類型、不完全類型或位字段。不完全類型指具有未知
存儲大小數據的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void
類型等。

(12)對函數使用sizeof,在編譯階段會被函數返回值的類型取代。如:int f1(){return
0;}。

(13)數組的大小是各維數的乘積×數組元素的大小。

15。找出下面程序的錯誤,並解釋它爲什麼是錯的。

image

sizeof(strArr1)爲12,sizeof(string)爲4 。sizeof(pStrArr1)爲4。爲了能完整顯示,應改成j<sizeof(*pStrArr1)*2/sizeof(string).

16.寫出下面sizeof的答案。

image

求類base的大小。因爲類base只有一個指針,所以類base的大小是4。Derive大小
與base類似,所以也是4。AA。

17.下面輸出結果是什麼。

image

因爲var[]等價於*var,已經退化成一個指針了,所以大小是4。

image

float f佔4個字節,char p佔1字節,int adf[3]佔12字節,總共是17字節。根據內
存對齊原則,要選擇4的倍數,是20字節。

18.一個空類佔多少空間?多重繼承的空類呢?

這說明空類所佔空間爲1,單一繼承的空類空間也爲1,
多重繼承的空類空間還是1。但是虛繼承涉及虛表(虛指針),所以sizeof(C)的大小爲4。

原文地址:https://www.cnblogs.com/K2154952/p/4758425.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章