c/c++常見面試題01

1、局部變量能否和全局變量重名?
   答:能,局部會屏蔽全局。要用全局變量,需要使用 ":: "
  局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
  
2、如何引用一個已經定義過的全局變量?
  答:extern
  可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯。
  
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?爲什麼?
  答:可以,在不同的C文件中以static形式來聲明同名全局變量。
  可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯
  
4、語句for( ;1 ;)有什麼問題?它是什麼意思?
  答:和while(1)相同。
  
5、do……while和while……do有什麼區別?
  答:前一個循環一遍再判斷,後一個判斷以後再循環
  
6、請寫出下列代碼的輸出內容

   #include 
   main() 
   { 
    int a,b,c,d; 
    a=10; 
    b=a++; 
    c=++a; 
    d=10*a++; 
    printf( "b,c,d:%d,%d,%d ",b,c,d;
    return 0; 
   } 

答:10,12,120

7、static全局變量與普通的全局變量有什麼區別?static局部變量和普通局部變量有什麼區別?static函數與普通函數有什麼區別?
  全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
  從以上分析可以看出, 把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域, 限制了它的使用範圍。
   static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明爲內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
   static全局變量與普通的全局變量有什麼區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
   static局部變量和普通局部變量有什麼區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

8、程序的局部變量存在於(堆棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。

9、設有以下說明和定義:

   typedef union {long i; int k[5]; char c;} DATE; 
   struct data { int cat; DATE cow; double dog;} too; 
   DATE max; 

則語句 printf( "%d ",sizeof(struct date)+sizeof(max));的執行結果是:52_

答:DATE是一個union, 變量公用空間. 裏面最大的變量類型是int[5], 佔用20個字節. 所以它的大小是20 ``

data是一個struct, 每個變量分開佔用空間. 依次爲int4 + DATE20 + double8 = 32.
所以結果是 20 + 32 = 52.
當然…在某些16位編輯器下, int可能是2字節,那麼結果是 int2 + DATE10 + double8 = 20

10、隊列和棧有什麼區別?   
  隊列先進先出,棧後進先出
  
11、寫出下列代碼的輸出內容

#include <stdio.h>
int inc(int a)
{
	return(++a);
}
int multi(int*a, int*b, int*c)
{
	return(*c = *a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2)(int*, int*, int*);
void show(FUNC2 fun, int arg1, int*arg2)
{
	INCp = &inc;
	int temp = p(arg1);
	fun(&temp, &arg1, arg2);
	printf("%d\n ", *arg2);
}
main()
{
	int a;
	show(multi, 10, &a);
	return 0;
}

答:110

11、請找出下面代碼中的所以錯誤
   說明:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”

#include "string.h "
main()
{
	char*src = "hello,world ";
	char* dest = NULL;
	int len = strlen(src);
	dest = (char*)malloc(len);
	char* d = dest;
	char* s = src[len];
	while (len-- != 0)
		d++ = s--;
	printf("%s ", dest);
	return 0;
}

答:

 int main() 
   { 
    char* src = "hello,world "; 
    int len = strlen(src); 
    char* dest = (char*)malloc(len+1);//要爲\0分配一個空間 
    char* d = dest; 
    char* s = &src[len-1];//指向最後一個字符 
    while( len-- != 0 ) 
    *d++=*s--; 
    *d = 0;//尾部要加\0 
    printf( "%s\n ",dest); 
    free(dest);// 使用完,應當釋放空間,以免造成內存匯泄露 
    return 0; 
   } 

12、對於一個頻繁使用的短小函數,在C語言中應用什麼實現,在C++中應用什麼實現?
答案:c用宏定義,c++用inline

13、軟件測試都有那些種類?
答案:黑盒:針對系統功能的測試 白合:測試函數功能,各函數接口

14、確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的?
答案:概要設計階段

15、

enum string
{
x1=,
x2,
x3=10,
x4,
x5,
}x;

問x
答案:取值在0、1、10、11、12中的一個。在全局域定義enum,輸出x是0,但是在局部域定義enum,輸出x是隨機數。x1=0,x2=1,x3=10,x4=11,x5=12.x=0。

16、

unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;

請問p1+5= ; p2+5= ;
答案:801005; 810014。不要忘記了這個是16進制的數字,p2要加20變爲16進制就是14

選擇題:

1.Ethternet鏈接到Internet用到以下那個協議?
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
2.屬於網絡層協議的是:
A.TCP;B.IP;C.ICMP;D.X.25
3.Windows消息調度機制是:
A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;
答案:b,a,c

找錯題:
1.請問下面程序有什麼錯誤?

int a[60][250][1000],i,j,k;
for(k=0;k<1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;

把循環語句內外換一下
(編譯的時候沒錯,運行的時候出錯,但這個數組太大,如果放在棧中,還是會溢出,要作爲全局變量)

2。以下是求一個數的平方的程序,請找出錯誤:

#define SQUARE(a) ((a)*(a))
int a=5;
int b;
b=SQUARE(a++);

答案:這個沒有問題,s(a++),就是((a++)×(a++))唯一要注意的就是計算後a=7了

3。

typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{ 
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR; 
}
.......
}

答案:要釋放內存(沒有free)

1、用宏定義寫出swap(x,y)

#define swap(x,y)
          x=x+y;
          y=x-y;
          x=x-y;
#define swap(x,y)
          x=x^y;
          y=x^y;
          x=x^y;

2.數組a[n],存放了1至n-1個數,其中某個數重複一次。寫一個函數,找出被重複的數字.時間複雜度必須爲o(n)函數原型:int do_dup(int a[],int n)


#include <stdio.h>

int do_dup(int a[],int n);
void main()
{
	int a[]={1,3,2,3};
	do_dup(a,4);
}

int do_dup(int a[],int n)
{
	int i;
	int *b=new int[n];
	for (i=0;i<n;i++)
		b[i]=0;
	for (i=0;i<n;i++)
	{
		if (b[a[i]]==0)
		{
			b[a[i]]=a[i];
		}
		else
			printf("%d\n",b[a[i]]);
	}
	delete []b;
	return 0;
}

3 一語句實現x是否爲2的若干次冪的判斷

#define is2*n(x)  ((x & (x - 1))? 0 : 1)
int main(void)
{
        int m = 512;
        cout << ((m & (m - 1)) ? false : true) << endl;
        //即當m中只有一位爲1時,才爲若干次冪值
        //若有兩個及以上1,則(m & (m - 1))不爲0,輸出0,表示不爲2的若干次冪
        return(0);
}

4 unsigned int intvert(unsigned int x, int p, int n)實現對x進行轉換,p爲起始轉換位,n爲需要轉換的長度,假設起始點爲右邊,如如x=0b0001 0001(十進制爲17),p=4,n=3轉換後x=0b0110 0001(十進制爲97)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned int intvert(unsigned int x, int p, int n) 
{
/*
x: 待轉換的值
p: 起始轉換位
n: 轉換的長度
如x=0b0001 0001,p=4,n=3轉換後 //17
 x=0b0110 0001 //97
*/
int i = 0;
unsigned int _a = 1;
	for (i = p; i < p+n; i++)
	{
		if (_a & (x >> i))//第i位爲1
		{
			x &= ~(1 << i);//某位清0
		}
	else//第i位爲0
	{
	x |= 1 << i;//某位置1
	}
}
return x;
}

int main(int argc, char* argv[])
{
	unsigned int x = 17; int p = 4; int n = 3;
	printf("%u從%d位起轉換%d位後得:%u\r\n", x, p, n, intvert(x, p, n));
	return 0;
}

選擇題
1. 在關係數據庫德詢問優化中,事先處理文件,如排序、建立索引的目的是:(D)
A.優化表達式 B。減少中間結束 C。擴大緩衝數據 D。 減少掃描文件的時間
2 . 有以下幾個條件成立:( D)
(1)如果小王是工人 ,那麼小張不是醫生
(2)或者小李是工人,或者小王是工人
(3)如果小張不是醫生,那麼小趙不是學生
(4)或者小趙是學生,或者小周不是經理
以下哪項如果爲真,可得出“小李是工人”的結論?
(A) 小周不是經理
(B) 小王是工人
(C) 小趙不是學生
(D) 小周是經理

電影《達芬奇密碼》中講到了一個非常有意思的數字序列—菲波拉契序列。請用任意計算機語言實現一段小程序,該程序在屏幕上輸出1到1000之間的非波拉契序列。
非波拉契序列:1,1,2,3,5,8,13,21,34,……

int fib(int n)
{
	if (n<1)
		return 0;
	if(n==1 || n==2)
		return 1;
	else(n<=1000)
		return fib(n-1)+fib(n-2);
}
#include<stdio.h>
int main()
{
	int a=1,b=1;
	do
	{
		printf("%d %d",a,b);
		a+=b;
		b+=b;
	}while(a<=1000&&b<=1000);
	return 0;
}

簡答題

1、C++中如何阻止一個類被實例化?
(1)定義一個無用的抽象函數,使得類成爲抽象類
(2)將構造函數定義爲private.
爲什麼要這樣做?
一些工具類,沒有被實例化的必要.

2、一般在什麼時候構造函數被聲明成private呢?
singleton模式; 阻止某些操作(如阻止拷貝構造)。

3、什麼時候編譯器會生成默認的copy constructor呢?
用戶沒有自定義copy constructor;在代碼中使用到了copy constructor;

4、如果你已經寫了一個構造函數,編譯器還會生成copy constructor嗎?
如果我寫的是copy constructor, 不會
如果我寫的不是copy constructor, 同3

5、struct和class有什麼區別?
1)class繼承默認是private繼承,而struct默認public繼承
2)在默認情況下,struct的成員變量是公共(public)的;在默認情況下,class的成員變量是私有(private)的。
3)class還用於定義模板參數,就像typename,而關鍵字struct不能

6、爲什麼說如果一個類作爲基類,則它的析構函數要聲明成virtual的?
(假定A是基類,B是從A繼承而來的派生類),那麼其(A類)析構函數必須是虛的,否則在delete d時,B類的析構函數將不會被調用,因而會產生內存泄漏和異常;

7、inline的函數和#define有什麼區別?
(1)內聯函數在運行時可調試,而宏定義不可以;
(2)編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數),而宏定義則不會;
(3)內聯函數可以訪問類的成員變量,宏定義則不能;

8、什麼時候會真的被inline,什麼時候不會呢?
當出現以下情況時inline失敗
函數size太大
inline虛函數
函數中存在循環或遞歸
函數調用其他inline函數

9、如果把一個類的成員函數寫在類的聲明中是什麼意思?
編譯器會默認做內聯函數處理,如同寫在外部而用inline聲明。但是如果函數中包含for、while等循環語句,依舊會按照外聯函數處理

10、public繼承和private繼承有什麼架構上的區別?
public :意味着在其後聲明的所有成員對所有的人都可以取。
private :關鍵字意味着除了該類型的創建者和類的內部成員函數之外,任何人都不能存取這些成員。
protect :它與private基本相似,只有一點不同:繼承的結構可以訪問protected成員,但不能訪問private成員
(1)不管是哪種繼承方式, 在派生類內部都可以訪問基類的公有成員和保護成員 , 基類的私有成員存在但是在子類中不可見( 不能訪問) 。
(2)使用關鍵字class時默認的繼承方式是private, 使用struct時默認的繼承方式是public, 不過最好顯式的寫出繼承方式。
(3)在實際運用中一般使用都是public繼承, 極少場景下才會使用protetced/private繼承。

11、在多繼承的時候,如果一個類繼承同時繼承自class A和class B,而class A和
B中都有一個函數叫foo(),如何明確的在子類中指出override哪個父類的foo()?
用 using,
using A::foo; // 從而B::foo()被覆蓋了。

12、虛擬繼承的語法是什麼?
◇語法:

class 派生類: virtual 基類1virtual 基類2...virtual 基類n
{
...//派生類成員聲明
};

編程題

1、函數 int compare(int a,int b),定義爲該函數的函數指針P:爲

int (*P)(int a,int b);
P=compare;

2、求結果

void sub(char*s,int num)
{
	int i ,j=num;
	char t;
	while(j-->1)
	{
		for(i=0;i<j;i++)
		{
			if(s)
			{
				t=s;
				s=s[i+1];
				s[i+1]=t;
			}
		}
	}
}
main()
{
char*s="CEAeded";
sub(s,6);
printf("%s\n",s)
}

ACEdeea

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