C/C++程序員面試基礎知識(一)

1問題:Stdio.h 的主要作用?

回答:stdio .h頭文件定義了三個變量類型、一些宏和各種函數來執行輸入和輸出。C語言

2問題: \n \r \t什麼意思?

回答:'\n' 換行, 將當前位置移到下一行開頭;

\r是回車, 將當前位置移到本行開頭;

\t水平製表(HT) (跳到下一個TAB位置。

3問題:||| &&&的區別?

回答:首先 &和|稱爲位運算符(按位進行與或),&&和||(按結果真假或0/1進行與或)稱爲邏輯運算符;邏輯運算符性能比較好。他檢查第一個操作數的值,再根據該操作數的值進行操作,可能根本就不處理第二個操作數。使用&&和||運算符來代替&和|,性能會有一定提高。

4問題: 後綴名爲.c.cpp?

回答:.c是c語言的源程序格式,.cpp是c++語言的源程序格式;C89規定,在任何執行語句之前,在塊的開頭聲明所有局部變量。在C99以及C++中則沒有這個限制,即在首次使用之前,可在塊的任何位置都可以聲明變量。

5問題: 不使用任何中間變量如何將a/b的值進行交換?

回答:①使用加減運算實現交換,a=a+b; b=a-b; a=a-b;(在a+b與a-b可能數據溢出)

②使用局部變量,int temp=a; a=b; b=temp;

③使用異或運算,a^=b; b^=a; a^=b;

6問題:cc++有什麼不同?

回答:C是一個結構化的語言,重點在於算法和數據結構,對語言本身C是C++的子集。

C程序的設計首先考慮的是如何通過一個過程實現對輸入進行運算後輸出,對於C++考慮的是如何構造一個對象模型,讓這個模型能夠匹配對應的問題,通過獲取對象的狀態信息得到輸出或實現過程控制。

因此,C與C++的最大區別在於,他們解決問題的思路方法是不一樣的。

C實現了C++中過程化控制及其他相關功能,而在C++中相對於C還有所加強,引入了重載、內聯函數、異常處理等,同時拓展了面向對象的設計內容,如類、繼承、虛函數、模板等。

附:C是面向過程的、C++面向對象(在C++中一樣可以寫出與C一樣過程化的程序,所以只能說C++具有面向對象的特性)、Java是真正面向對象化的程序。

7問題: 爲什麼標準頭文件都有#ifndef  _xxxxxx; #define _xxxxxx          #endif?

回答:這樣定義是爲了避免重複定義。重複聲明可以,但是重複定義是不可以的。重複聲明只要名稱完全相同即可。但是重複定義會出現編譯錯誤的,即使同名也不可以。

8問題: #include<head.h>#include “head.h”的區別?

回答:尖括號< >表明這個文件是一個工程或標準的頭文件,在預處理查找過程中會首先檢查系統預定義的目錄,如果沒有找到就報錯。

雙引號" "表明這是一個用戶自定義的頭文件,查找文件的時候會先在當前文件目錄中查找,如果沒有找到再去系統預定義的目錄中查找,如果沒有找到再報錯。

9問題:關於宏定義#define ARR_SIZE(a)   (sizeof(a)/sizeof(a[0]))),假設一個數組定義如下 int array[100]?

回答:如果int爲4個字節,那麼sizeof(array)就爲400個字節,sizeof(a[0])爲一個int的大小,即4個字節。兩個數一除就是數組元素個數。

10問題: 關於const的使用注意點,例子如下:

#include <stadio.h>
Int main()
{
const int x=1;
int b=10;

int c=20;
const int *a1=&b;
int * const a2=&b;
const int* const a3=&b;

x=2;      //錯誤

a1=&&c;   //正確
*a1=1;    //錯誤

a2=&c;    //錯誤
*a2=1;    //正確

a3=&c;    //錯誤
*a3=1;    //錯誤
return 0;
}

回答:x=2;,由於x爲整型常量,因此不能改變x的值。

a1=&&c;中const在int*的左側,它修飾的是指針所指向的變量,即指針指向爲常量,故a1=&&c正確; *a1=1;錯誤,其它的判斷類似。

int * const p ;表示指針變量本身不能被修改

const int *p這表示p所指向的空間內容不可修改

11問題: const有什麼作用?

回答:①定義const常量,具有不可變性,進行類型檢查,消除一些隱患

           ②保護被修飾的東西,防止被意外修改,增強了程序的健壯性。

           ③爲函數重載提供參考

           ④節省空間,避免不必要的內存分配

引申:什麼情況下需要使用const關鍵字?

           1. 修飾一般常量。eg.int const x=2 或 const int x=2。

           2. 修飾常數組。eg. int const a[8] = {1,2,3,4,5,6,7,8};  const int a[8]={1,2,3,4,5,6,7,8};

           3. 修飾常對象。常對象是指對象常量。eg. class A; const A a; A const a;

             定義常對象時,同樣要進行初始化,並且該對象不能再被更新,修飾符const可以放在類名後面,也可以放在類名前面。

           4. 修飾常指針

const int *A; //const 修飾指向的對象,A可變,A指向的對象不可變

int const *A; //const 修飾指向的對象,A可變,A指向的對象不可變

int *const A; //const 修飾指針A,A不可變,A指向的對象不可變

const int *const A; //指針A和A指向的對象都不可變

12問題: static有什麼作用?

回答1:1)在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。

           2) 在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

           3) 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用

回答2:在C語言中,static主要定義全局靜態變量,定義局部靜態變量,定義靜態函數

 一、定義全局靜態變量 :在全局變量前面加上關鍵字static,該全局變量變成了全局靜態變量。

 二、定義局部靜態變量:在局部靜態變量前面加上關鍵字static,該局部變量便成了靜態局部變量。其作用域爲局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。

三、定義靜態函數:在函數的返回類型加上static關鍵字,函數即被定義成靜態函數。靜態函數有以下特點:

(1)靜態函數只能在本源文件中使用

(2)在文件作用域中聲明的inline函數默認爲static

說明:靜態函數只是一個普通的全局函數,只不過受static限制,他只能在文件所在的編譯單位內使用,不能呢個在其他編譯單位內使用。

在C++語言中新增了兩種作用:定義靜態數據成員靜態函數成員

(1)定義靜態數據成員。靜態數據成員有如下特點:

(1)內存分配:在程序的全局數據區分配

(2)初始化和定義:靜態數據成員定義時要分配空間,所以不能在類聲明中定義

(3)靜態成員函數。靜態成員函數與類相聯繫,不與類的對象相聯繫。靜態成員函數不能訪問非靜態數據成員。原因很簡單,非靜態數據成員屬於特定的類實例,主要用於對靜態數據成員的操作。

(4)靜態成員函數和靜態數據成員都沒有this指針。

13問題:一個指針佔用幾個字節?

回答:指針即爲地址,指針佔幾個字節跟語言無關,而是跟系統的尋址能力有關,譬如:以前是16位地址,指針即爲2個字節,現在一般是32位系統,所以是4個字節,以後64位,則就佔8個字節

14問題: strlensizeof有什麼區別?

回答:①strlen是函數,sizeof是操作符;

           ②在計算字符串數組的長度上有區別,如

char str[20]=”0123456789”;
int a=strlen(str);
int b=sizeof(str);

這裏的a計算的是以0x00結束的字符串的長度(不包括0x00結束符),這裏的結果是10;

這裏的b計算的則是分配的數組str[20]所佔的內存空間的大小,不受裏面的存儲內容的改變而改變,這裏的結果是20

           ③如果要計算指針指向的字符串的長度,則一定要用strlen,如

char *ss=”0123456789”;
int a=strlen(ss);  //ss指針所指向的字符串的長度,結果是10
int b=sizeof(ss);   //ss指針所佔用的內存空間大小,結果是4

 

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