c/c++基礎

1. 變量的聲明與定義有何區別

    爲變量分配地址和存儲空間的稱爲定義,不分配地址的稱爲聲明。 

2.談談對編程規範的理解或認識

   程序的可行性、可讀性、可移植性和可測試性。

3. 寫出bool、int、float、指針變量與"零值“的比較if語句

//bool
if(flag)
{
  ;
}
else
{
  ;
}
//int
if(0==flag)
{
  ;
}
else
{
  ;
}
//float
const float num=0.000001
if((flag>=-num)&&(flag<=num))
{
 ;
}
else
{
  ;
}
//指針
if(NULL==flag)
{
 ;
}
else
{
 ;
}
4.

<pre name="code" class="cpp">int _tmain(int argc, _TCHAR* argv[])
{
	int a=10;
	int b=3;
	
	for(int i=0;a<9;i++,b++)
	{
	   a--;
	   b+=5;
	}
    printf("%d,%d,%d",b,a+b++,a++);

	return 0;
}



for循環,當不滿足循環條件,不會執行循環體,也不會執行for的第三部分(i++,b++)。

printf函數執行順序是從右向左。

則最終輸出結果爲: 4,14,10

5. &&和&,||和|的區別

  &位與,|位或都是對操作數進行求值運算,&&和||只是判斷邏輯關係

 &&和||在判斷左側操作數就能確定結果下,將不會判斷右側操作數

6. 左值和右值的含義

右值: 存儲在某地址中的數值。

左值: 存儲數值的那塊內存地址。

7. sizeof和strlen有何區別

   sizeof爲操作符,strlen爲庫函數;

   sizeof的參數可以爲數據類型,也可以是變量,而strlen的參數只能是以'\0'結尾的字符串;

   sizeof計算的是數據類型或數據所佔內存大小,而strlen計算的字符串長度; sizeof在編譯階段就計算出結果,而strlen函數需要在運行時才能計算結果;

   數組名做sizeof參數時的參數不退化,而作爲strlen函數參數時就退化爲指針。

int _tmain(int argc, _TCHAR* argv[])
{
    
	char *s="abcdefg";
	char str[10]="abcd";
	cout<<sizeof(s)<<" "<<strlen(s)<<endl;
	cout<<sizeof(str)<<" "<<strlen(str)<<endl;
	return 0;
}

運行結果爲:

                  4  7

                  10   4

8. 數組類型、結構類型和聯合類型都屬於構造數據類型。

9.  C語言中的結構體和C++中的類的區別

    C語言中的結構體是不能有函數成員的,而C++的類是有的;

     C語言結構體中數據成員沒有private、public和protected訪問限定,而C++中的類成員是有這些訪問限定的;

     C語言中結構體沒有繼承關係的,而C++中的類有豐富的繼承關係。

10. C中malloc、free和C++中的new、delete有何區別

      malloc、free是函數,在C和C++中都可以使用;

      new、delete是操作符, 只能在C++中使用;  

     new創建對象時可以調用對象的構造函數,delete刪除對象時可以調用對象的析構函數;

     malloc 僅僅分配內存,free僅僅回收內存,並不執行構造和析構函數;

      new和delete返回的是某種數據類型的指針,而maolloc和free返回的是void指針。

11. 引用和指針有何區別?

     引用必須初始化,但不分配內存空間; 指針不聲明時初始化,在初始化時需要分配內存空間;

     引用初始化以後不能改變,指針可以改變所指的對象;

      不存在指向空值的引用,存在指向空值的指針。

12. 簡述#ifdef、#else、#endif和#ifndef的作用

    #ifdef、#endif 可以將某程序功能模塊包括進去,以向特定用戶提供該功能;

    在子程序前加上標記,便於追蹤和調試;

    對硬件的限制。

13. 宏定義和函數的區別

   宏的引用只佔編譯時間,不佔用運行時間;

  宏定義沒有返回值;

   宏定義的形參沒有類型,函數的形參必須要有類型;

   實參爲表達式的情況,如果不給表達式加上括號,可能會得出錯誤的結果;而函數不會。

   宏直接替代可能會導致副作用,函數不會。

#define DIVDEF(a,b)  (a/b)
float Div(float a,float b)
{
	return a/b;
}
int _tmain(int argc, _TCHAR* argv[])
{
    float x=4,y=2;
	cout<<DIVDEF(x+y,x-y)<<endl;
	cout<<Div(x+y,x-y)<<endl;
	return 0;
}
上述代碼運行結果爲:

      2.5

     3.0

14. 寫一個“標準” 宏min

#define min(a,b)  ((a)<=(b)?(a):(b))

對錶達加括號,防止13中程序出現的錯誤。

宏定義的副作用,如:

((++*p)<=(x)?(++*p):(x))   p指針加了2次,顯然不符。

15. typedef和define的區別

   用法不同: typedef 主要用來定義數據類型的別名,而define主要定義常量,以及書寫複雜、頻繁的宏。

  執行時間不同: typedef 是編譯過程的一部分,有類型檢查的功能;而宏定義是預編譯的一部分,只是進行簡單的字符串的替換,不進行類型的檢查。

 作用域不同: typedef有限定作用域,而define不受作用域約束。

 對指針的操作不同: typedef和define定義的指針有很大的區別。

16. #define CHAR char* 和typedef char* CHAR 的作用是否相同?各有什麼優劣?

   #define 定義的類型別名代表指針時,可以被其他修飾符擴展(如:unsigned) ,而typedef不可以。

      #define 定義的類型別名代表指針時,連續聲明幾個變量中,只有第一個是指針,其他的均爲非指針的普通變量;而typedef能夠保證連續聲明的變量均爲同一類型。


參考文獻: 《c/c++ 程序員面試指南》楊國祥等編著  電子工業出版社

發佈了62 篇原創文章 · 獲贊 23 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章