久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3752|回復: 4
打印 上一主題 下一主題
收起左側

C語言基本概念及其辨析

[復制鏈接]
跳轉到指定樓層
樓主
ID:94349 發表于 2015-11-10 01:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1.關鍵字 static 的作用是什么?
在 C 語言中,關鍵字 static有三個明顯的作用
解析:
a. 在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
b. 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它
函數訪問。它是一個本地的全局變量。
c. 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲
明它的模塊的本地范圍內使用。

2.引用和指針的區別是什么?
解析:
a. 引用必須被初始化,指針不必。
b. 引用初始化以后不能被改變,指針可以改變所指的對象。
c. 不存在指向空值的引用,但是存在指向空值的指針。

3..h 頭文件中的 ifndef/define/endif 的作用:
解析:
防止該頭文件被重復引用

4.#include 與 #include "file.h"的區別?
解析:
前者是從 Standard Library 的路徑尋找和引用 file.h,而后者是從當前工作路徑搜尋并引用 file.h

5.全局變量與局部變量在內存中的區別?
解析:
全局變量儲存在靜態數據區,局部變量在堆棧中

6.堆棧溢出一般有什么原因能導致?
解析:
a.沒有回收垃圾資源
b.層次太深的遞歸調用

7.不能申明為虛函數的函數?
解析:
constructor

8.隊列與棧的區別?
解析:
隊列先進先出,棧后進先出

9.不能做switch()的參數類型
解析:
Switch的參數不能為實型

10.局部變量和全局變量能否重名?

解析:
能,局部會屏蔽全局。要用全局變量,需要使用"::"
局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。

11.如何引用一個已經定義過的全局變量?
解析:
可以用引用頭文件的方式,也可以用 extern 關鍵字
如果用引用頭文件方式來引用某個在頭文件中聲明的全局變量,假定你將那個變量寫錯了,那么在編譯期間會報錯
如果你用 extern 方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。

12.語句 for( ;1 ;)有什么問題?它是什么意思?

解析:
和 while(1)相同,無限循環

13.程序的內存分配?
解析:
一個由 c/C++編譯的程序占用的內存分為以下幾個部分:
a.棧區(stack)—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似于數據
結構中的棧
b.堆區(heap)—一般由程序員分配釋放,若程序員不釋放,程序結束時可能由 OS回收。注意它與數據結
構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵
c.全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量
在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束后由系統釋放.
d.文字常量區—常量字符串就是放在這里的。程序結束后由系統釋放
e.程序代碼區—存放函數體的二進制代碼
例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a=0;   //全局初始化區
char *p1;   //全局未初始化區
main()
{
intb;棧
char s[]="abc";   //棧
char*p2;        //棧
char *p3="123456";   //123456\0在常量區,p3 在棧上。
static int c=0;  //全局(靜態)初始化區
p1 = (char*)malloc(10);
p2 = (char*)malloc(20);   //分配得來得10 和 20 字節的區域就在堆區。
strcpy(p1,"123456");   //123456\0放在常量區,編譯器可能會將它與 p3 所向"123456"優化成一
個地方。
}

14.三種基本的數據模型?
解析:
按照數據結構類型的不同,將數據模型劃分為層次模型、網狀模型和關系模型

15.結構和聯合有什么區別?
解析:
a. 結構和聯合都是由多個不同的數據類型成員組成, 但在任何同一時刻,
聯合中只存放了一個被選中的成員(所有成員共用一塊地址空間),
而結構的所有成員都存在(不同成員的存放地址不同)。
b. 對于聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構的不同成員賦值是互不影響的

16.描述內存分配方式以及它們的區別?
解析:
a.從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
b.在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
c.從堆上分配,亦稱動態內存分配。程序在運行的時候用 malloc 或 new 申請任意多少的內存,程序員自己負責在何時用 free或 delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多

17.請說出 const 與#define 相比,有何優點?
解析:
Const 作用:定義常量、修飾函數參數、修飾函數返回值三個作用。被 Const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性
a.const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。
b. 有些集成化的調試工具可以對 const 常量進行調試,但是不能對宏常量進行調試

18.分別寫出 BOOL,int,float,指針類型的變量 a 與“零”的比較語句?
解析:
BOOL :    if (!a ) or if(a)
int:    if ( a == 0)
float :   const EXPRESSION EXP =0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)

19.如何判斷一段程序是由C編譯程序還是C++編譯程序編譯的?
解析:
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif

20.論述含參數的宏與函數的優缺點?
解析:         帶參宏                    函數
處理時間    編譯時                     程序運行時
參數類型    沒有參數類型問題     定義實參、形參類型
處理過程    不分配內存                分配內存
程序長度    變長                         不變
運行速度    不占運行時間            調用和返回占用時間

21.用兩個棧實現一個隊列的功能?要求給出算法和思路?
解析:
設 2 個棧為 A,B, 一開始均為空.
入隊:
將新元素 push 入棧 A;
出隊:
(1)判斷棧 B 是否為空;
(2)如果不為空,則將棧 A 中所有元素依次 pop 出并 push 到棧 B;
(3)將棧 B 的棧頂元素 pop 出;
這樣實現的隊列入隊和出隊的平攤復雜度都還是 O(1), 比上面的幾種方法要好

22.中斷(Interrupts)
解析:
中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提供一種擴展—讓標準 C 支持中斷。具代表事實是,產生了一個新的關鍵字__interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一個中斷服務子程序(ISR),請評論一下這段代碼的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
這個函數有太多的錯誤了,以至讓人不知從何說起了:
1)ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。
2) ISR 不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同第一項。
3) 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR 中做浮點運算。此外,ISR 應該是短而有效率的,在 ISR 中做浮點運算是不明智的。
4)與第三點一脈相承,printf()經常有重入和性能上的問題。如果你丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那么你的被雇用前景越來越光明了

23.寫一個“標準”宏
解析:
輸入兩個參數,輸出較小的一個:#define MIN(A,B) ((A) < (B))? (A) : (B))
表明 1 年中有多少秒(忽略閏年問題):#define SECONDS_PER_YEAR (60 * 60 * 24 *365)UL
以下是加括號和不加括號的區別:
#define DOUBLE(x) x+x 與    #defineDOUBLE(x) ((x)+(x))
i = 5*DOUBLE(5); i 為 30  i = 5*DOUBLE(5); i 為50

24. A.c 和 B.c 兩個 c 文件中使用了兩個相同名字的 static變量,編譯的時候會不會有問題?這兩個 static變量會保存到哪里(棧還是堆或者其他的)?
解析:
static 的全局變量,表明這個變量僅在本模塊中有意義,不會影響其他模塊。
他們都放在數據區,但是編譯器對他們的命名是不同的。
如果要使變量在其他模塊也有意義的話,需要使用 extern 關鍵字
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:94349 發表于 2015-11-10 01:44 | 只看該作者
1.sscanf 和printf
fgets(buf, sizeof(buf), stdin);
scanf(buf, "%d",&hoge);  
sscanf是以行單位對輸入內容進行解釋;
scanf("%d", &hoge);scanf是對連續字符流進行解釋的;
sscanf和fgets配合使用,能夠達到輸入,敲擊回車,連續輸出值;scanf則達不到這樣的效果!!

2.存儲類型修飾符
以下關鍵字被定義為存儲類型修飾符:
typedef   extern   static  auto   register
但是,只有static才是真正的“指定存儲區間”關鍵字
extern使得在其他地方定義的外部變量在本地可見;auto為默認,無顯示指定的必要;register可以給出編譯器優化提示(因為如今的編譯已經很先進了,所以這個基本不用),至于typedef,他只是因為可以給編碼帶來便利才被歸納到存儲類型修飾符中來。
回復

使用道具 舉報

板凳
ID:433680 發表于 2018-12-24 11:51 | 只看該作者
學習了,感謝樓主了!!
回復

使用道具 舉報

地板
ID:98222 發表于 2018-12-25 09:07 | 只看該作者
學習學習
回復

使用道具 舉報

5#
ID:433680 發表于 2018-12-25 11:49 | 只看該作者
學習了,感謝樓主了!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年人黄色免费视频 | 欧美一级免费 | 欧美日韩亚洲国产综合 | 日韩第一区 | 2018中文字幕第一页 | 久久久91精品国产一区二区三区 | 啪啪精品 | 精品国产乱码一区二区三区 | 亚洲成人精品国产 | 中文字幕 视频一区 | 国产高清精品在线 | 国产一级电影在线观看 | 成人午夜免费福利视频 | 在线毛片网 | 久久手机视频 | 精品九九 | 在线视频国产一区 | av国产精品 | 久久久精品久久久 | 最新中文字幕久久 | 精品日本久久久久久久久久 | 日本成人综合 | 精品欧美一区二区中文字幕视频 | 久久成人精品一区二区三区 | 成人欧美一区二区 | 81精品国产乱码久久久久久 | 成人在线免费视频 | 国内精品视频一区二区三区 | 免费毛片网站 | 久久在看 | 91资源在线播放 | 日韩一区二区在线视频 | 国产精品久久久久久网站 | 久久国内| 国产精品我不卡 | 国产99精品 | 天天干亚洲 | 在线观看亚洲专区 | 中文天堂在线观看 | 国产综合第一页 | 综合精品久久久 |