99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

朱兆祺教你C語言筆試、學習與機試難點(連載)

C語言編程中的幾個基本概念

1.1 #include< >與#include" "

1. #include< >和#include" "有什么區別?

這個題目考查大家的基礎能力,#include< >用來包含開發環境提供的庫,

#include" "用來包含.c/.cpp文件所在目錄下的頭文件。注意:有些開發環境可以在當前目錄下面自動收索(包含子目錄),有些開發環境需要指定明確的文件路徑名。

1.2 switch()

1. switch(c) 語句中 c 可以是 int, long, char, float, unsigned int 類型?

其實這個題目很基礎,c應該是整型或者可以隱式轉換為整型的數據,很明顯不能是實型(float、double)。所以這個命題是錯誤的。

1.3 const

1. const有什么用途?

雖然const很常用,但是我相信有很多人仍然答不上來。

(1) 欲阻止一個變量被改變,可以使用const 關鍵字。在定義該 const 變量時,通常需要對它進行初 始化,因為以后就沒有機會再去改變它了;

(2) 對指針來說,可以指定指針本身為 const,也可以指定指針所指的數據為 const,或二者同時指定為 const;

(3) 在一個函數聲明中,const 可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;

(4) 對于類的成員函數,若指定其為 const 類型,則表明其是一個常函數,不能修改類的成員變量;

(5) 對于類的成員函數,有時候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。

1.4 #ifndef/#define/#endif

1. 頭文件中的 #ifndef/#define/#endif 干什么用?

其實#ifndef、#define、#endif這些在u-boot、linux內核文件中經常見到,在這么大型的程序中大量使用,可見它的作用不可小覷。

這些條件預編譯多用于對代碼的編譯控制,增加代碼的可裁剪性,通過宏定義可以輕松的對代碼進行裁剪。

#ifndef/#define/#endif最主要的作用是防止頭文件被重復定義。

1.5 全局變量和局部變量

1. 全局變量和局部變量在內存中是否有區別?如果有,是什么區別?

全局變量儲存在靜態數據庫,局部變量在堆棧。 其實,由于計算機沒有通用數據寄存器,則函數的參數、局部變量和返回值只能保存在堆棧中。提示:局部變量太大可能導致棧溢出,所以建議把較大數組放在main函數外,防止產生棧溢出。

思考:如程序清單1. 1所示。會出現怎樣的情況?

程序清單1. 1 大數組放在main函數中導致堆棧溢出

int main(int argc, char *argv[])

{

int iArray[1024 * 1024];

return 0;

}

全部回復(1)
正序查看
倒序查看
一木01
LV.3
2
2014-02-15 16:46

第二節 數據存儲與變量

2.1 變量的聲明與定義

1. 如程序清單2. 1所示會不會報錯?為什么?如果不會報錯,又是輸出什么結果?

程序清單2. 1 變量的聲明與定義

#include

static int a ;

static int b[] ;

int main( int argc , char *argv[] )

{

printf( "%d %d \n" , a , b[0] ) ;

return 0 ;

}

static int a = 8 ;

static int b[4] ;

這個程序是不會報錯的,并且連警告都不會出現。輸出的結果是:8 0

static int a ,這句程序是聲明全局變量a;static int b[],這句程序是聲明全局數組變量b,并且是不完全聲明,也就是可以省略數組下標。static int a = 8,這里才是定義全局變量a,static int b[4],這里是定義全局變量b。

2.2 局部變量與全局變量的較量

1. 請問如程序清單2. 2所示輸出什么?

程序清單2. 2 局部變量與全局變量

#include

static int a = 8 ;

int main( int argc , char *argv[] )

{

int a = 4 ;

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

return 0 ;

}

C語言規定,局部變量在自己的可見范圍內會“擋住”同名的全局變量,讓同名的全局變量臨時不可見。即在局部變量的可見范圍內不能訪問同名的全局變量。因此本程序輸出為:4。

2.3 char、int、float、double的數據存儲

1. 請問如程序清單2. 3所示,i和j輸出什么?

程序清單2. 3 數據存儲

float i = 3 ;

int j = *(int*)(&i) ;

printf( "i = %f \n" , i ) ;

printf( "j = %#x \n" , j ) ;

i是毋庸置疑是:3.000000。但是j呢?3.000000?答案是否定的,j是輸出:0x4040 0000。有人會問了,難道j是隨機輸出?瞎說,j輸出0x4040 0000是有依據,是一個定值!

由于i是float數據類型,而j是int數據類型。理論上說,j是取了i的地址然后再去地址,應該得到的就是i的值:3。但是問題的關鍵就是float數據類型的存儲方式和int數據類型不一樣,float是占用4個字節(32位),但是float存儲是使用科學計數法存儲,最高位是存儲數符(負數的數符是0,正數的數符是1);接下來8位是存儲階碼;剩下的23位是存儲尾數。上面i=3.000000,那么3.000000(10進制) = 11(2進制) = (二進制)。數據在電腦中存儲都是二進制,這個應該都沒有疑問。那么這里的數符為:0 ,階碼為:E – 127 = 1 ,那么階碼為:E = 128 即為:1000 0000 (2進制) ,尾數為:100 0000 0000 0000 0000 0000 。那么存儲形式就是:0100 0000 0100 0000 0000 0000 0000 0000。這個數據轉換成16進制就是0x4040 0000。

 

圖2. 1 數據存儲方式

char、int、float、double的存儲方式如圖2. 1所示。

提問:如果i = -3.5 的話,請問j輸出多少?

i = -3.500000

j = 0xc0600000

這個希望讀者自行分析。

再問:如果如程序清單2. 4所示。

程序清單2. 4 數據存儲

double i = 3 ;

int j = *(int*)(&i) ;

printf( "i = %lf \n" , i ) ;

printf( "j = %#x \n" , j ) ;

這樣的話,j又輸出多少呢?

提示:double( 8個字節(64位) )的存儲方式是:最高位存儲數符,接下來11位存儲階碼,剩下52位存儲尾數。

是不是得不到你想要的結果?double是8個字節,int是4個字節。一定別忘記了這個。用這個方法也同時可以驗證大小端模式!

2.4 容易忽略char的范圍

1. 如程序清單2. 5所示,假設&b=0x12ff54,請問三個輸出分別為多少?

程序清單2. 5 char的范圍

unsigned int b = 0x12ff60 ;

printf("( (int)(&b)+1 ) = %#x \n" , ( (int)(&b)+1 ) ) ;

printf("*( (int*)( (int)(&b)+1 ) ) = %#x \n" , *( (int*)( (int)(&b)+1 ) ) ) ;

printf("*( (char*)( (int)(&b)+1 ) ) = %#x \n" , *( (char*)( (int)(&b)+1 ) ) ) ;

很顯然,&b是取無符號整型b變量的地址,那么(int)(&b)是強制轉換為整型變量,那么加1即為0x12ff54+1=0x12ff55。所以( (int)(&b)+1 )是0x12ff55。

 

圖2. 3 指針加1取字符型數據

由于( (int)(&b)+1 )是整型數據類型,通過(int *)( (int)(&b)+1 )轉化為了整型指針類型,說明要占4個字節,即為:0x12ff55、0x12ff56、0x12ff57、0x12ff58,再去地址*( (int *)( (int) (&b)+1 ) )得到存儲在這4個字節中的數據。但是很遺憾,0x12ff58我們并不知道存儲的是什么,所以我們只能寫出0x**0012ff。**表示存儲在0x12ff58中的數據。如圖2. 2所示。

 

圖2. 2 指針加1取整型數據

以此類推,*( (char *)( (int) (&b)+1 ) ) = 0xff。如圖2. 3所示。

但是,*( (char *)( (int) (&b)+1 ) )輸出的卻是:0xff ff ff ff !

問題出現了,為什么*( (char *)( (int) (&b)+1 ) )不是0xff,而是0xff ff ff ff?char型數據應該占用1個字節,為什么會輸出0xff ff ff ff?

使用%d輸出,

printf("*( (char*)( (int)(&b)+1 ) ) = %d \n" , *( (char*)( (int)(&b)+1 ) ) ) ;

結果為-1???

問題出在signed char 的范圍是:-128~127,這樣肯定無法儲存0xff,出現溢出。所以將

printf("*( (char*)( (int)(&b)+1 ) ) = %#x \n" , *( (char*)( (int)(&b)+1 ) ) ) ;

改成

printf("*( (unsigned char*)( (int)(&b)+1 ) ) = %#x \n" ,

*( (unsigned char*)( (int)(&b)+1 ) ) ) ;

就可以輸出0xff,因為unsigned char 的范圍是:0~255(0xff)。

0
回復
主站蜘蛛池模板: 91老司机福利在线视频 | av在线色 | 欧美va免费高清在线观看 | 一本一道波多野结衣av黑人 | 免费在线观看av的网站 | www亚洲最大aⅴ成人天堂 | 久久69av | 亚洲综合色视频 | 亚洲国产精品综合小说图片区 | 99久久免费国产精精品 | 刮伦人妇a片1级 | 国产精品视频区1 | 青青操在线播放 | 网站黄色在线观看 | 7799国产精品久久99 | 天天爱综合网 | 2级毛片 | 东京热亚洲精品中文一区 | 精品久久久久久久久久久久包黑料 | 人av在线 | 国产成人AV片无码免费 | 亚州黄色一级 | 国产av一级毛片 | 国产又黄又爽胸又大免费视频 | 男人插女人逼逼视频 | 欧美性xxxx视频 | 久久亚洲色WWW成人 wwwwwww黄 | 男人日批| 高清亚洲一区 | 18禁美女裸体爆乳无遮挡 | 日韩综合网 | 国产精品视频麻豆 | 无码国产69精品久久久孕妇 | 成人福利网址 | 亚洲成人av免费观看 | 国产系列视频二区 | 性欧美乱妇com喷浆水多 | 色婷婷综合久久久久中国一区二区 | 毛茸茸xxxxx| 欧美中文字幕第一页 | 国产aⅴ无码久久久高潮老头 |