日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

笔试总结2(整理 觉得比较好的)

發布時間:2025/10/17 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 笔试总结2(整理 觉得比较好的) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別??
static全局變量與普通的全局變量有什么區別:
static全局變量只初使化一次,防止在其他文件單元中被引用;   
static局部變量和普通局部變量有什么區別:
static局部變量只被初始化一次,下一次依據上一次結果值;   
static函數與普通函數有什么區別:
static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
2、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態區 )中,動態申請數據存在于( 堆)中。
3、寫出下列代碼的輸出內容   
#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)  
  {    
? FUNC1 p=&inc;   
  int temp =p(arg1);   
  fun(&temp,&arg1, arg2);   
  printf("%dn",*arg2);   
?}   
?main()   
?{   
  int a;    ? ? ? //局部變量a為0;
  show(multi,10,&a);    
?return 0;
   }  
 答:110  
4、請找出下面代碼中的所有錯誤 (題目不錯,值得一看)  
說明:以下代碼是把一個字符串倒序,如“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;   
}   
答:   
方法1:一共有4個錯誤;   
int main()   
{   
 char* src = "hello,world";   
 int len = strlen(src);   
 char* dest = (char*)malloc(len+1);//要為分配一個空間    char* d = dest;   
 char* s = &src[len-1]; ? ? ? ? ?//指向最后一個字符  
 while( len-- != 0 )   
  *d++=*s--;   
 *d = 0; ? ? ? ? ? //尾部要加’/0’   
 printf("%sn",dest);    
free(dest); ? ? ? ?// 使用完,應當釋放空間,以免造成內存匯泄露
dest = NULL;   //防止產生野指針 
return 0;  
 }
方法2: (方法一需要額外的存儲空間,效率不高.) 不錯的想法
#include <stdio.h>
#include <string.h>
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i<len/2; i++)
{
t=str[i];
str[i]=str[len-i-1]; //小心一點
str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
5、軟件測試都有那些種類?  
 黑盒:針對系統功能的測試   
白盒:測試函數功能,各函數接口?
6、選擇題:   
Ethternet鏈接到Internet用到以下那個協議? D  
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID    
屬于網絡層協議的是:( B C)     
? A.TCP;B.IP;C.ICMP;D.X.25  
Windows消息調度機制是:(C) 
  A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;
7、TCP/IP通信建立的過程怎樣,端口有什么作用?   
三次握手,確定是哪個應用程序使用該協議?
8、找錯題
(1).#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
答: 死循環,unsigned int的取值范圍是0~255
8、Windows下的內存是如何管理的?
? 分頁管理
9、什么是預編譯,何時需要預編譯:
答: 就是指程序執行前的一些預處理工作,主要指#表示的.
何時需要預編譯?
1)、總是使用不經常改動的大型代碼體。
2)、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個預編譯頭。
10、 下述三個有什么區別?
char * const p;
char const * p
const char *p
解答:
char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和char const *p


有以下表達式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
請問下列表達式哪些會被編譯器禁止?為什么?
答:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c 這是個什么東東,禁止
*d 說了是const, 禁止
e = &a 說了是const 禁止
const *f const =&a; 禁止


11、以下代碼中的兩個sizeof用法有問題嗎?
void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符長度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函數內的sizeof有問題。根據語法,sizeof如用于數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小為6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用于上只將其當指針看,一個指針為4個字節,因此返回4。
? ?注意:數組名作為函數參數時,退化為指針.
? ? ? ? 數組名作為sizeof()參數時,數組名不退化,因為sizeof不是函數.
12、請問以下代碼有什么問題:
1).
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答;沒有為str分配內存空間,將會發生異常
問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程序崩潰。
Strcpy的在庫函數string.h中.程序的主要錯誤在于越界進行內存讀寫導致程序崩潰//
2).
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么錯?
答: "AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。
cosnt char* s="AAA";
然后又因為是常量,所以對是s[0]的賦值操作是不合法的。
13、寫一個“標準”宏,這個宏輸入兩個參數并返回較小的一個。
答:#define Min(X, Y) ((X)>(Y)?(Y):(X))?
14、(1)、關鍵字static的作用是什么?
答:1)定義靜態局部變量,作用域從函數開始到結束.
?2) 在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;
?3) 在類中的static成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝
(2)、關鍵字const有什么含意?
答 :1)表示常量不可以修改的變量。
? ?2)可以修飾參數,作為輸入參數.
? ?3)修飾函數,防止以外的改動.
? ?4)修飾類的成員函數,不改變類中的數據成員.
(3)、關鍵字volatile有什么含意?并舉出三個不同的例子?
答: 提示編譯器對象的值可能在編譯器未監測到的情況下改變。
? ?例子: 硬件時鐘;多線程中被多個任務共享的變量等
15、int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。


16、c和c++中的struct有什么不同?
答: c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private.
17、#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
}
int main( )
{
char *str=NULL;
getmemory(str);
strcpy(p,"hello world");
printf("%s/n",str);
free(str);
return 0;
}
答: 程序崩潰,getmemory中的malloc 不能返回動態內存, free()對str操作很危險
18、char szstr[10];
strcpy(szstr,"0123456789");
產生什么結果?為什么?

答;正常輸出,長度不一樣,會造成非法的OS,覆蓋別的內容.

19、c指針
int *p[n];-----指針數組,每個元素均為指向整型數據的指針。
int (*p)[n];------p為指向一維數組的指針,這個一維數組有n個整型數據。
int *p();----------函數帶回指針,指針指向返回的值。
int (*p)();------p為指向函數的指針。
20、ASSERT()是干什么用的
答:ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式為FALSE (0), 程序將報告錯誤,并終止執行。如果表達式不為0,則繼續執行后面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重后果,同時也便于查找錯誤。例如,變量n在程序中不應該為0,如果為0可能導致錯誤,你可以這樣寫程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。
21、system("pause");作用?
答:系統的暫停程序,按任意鍵繼續,屏幕會打印,"按任意鍵繼續。。。。。" 省去了使用getchar();
22、請講一講析構函數和虛函數的用法和作用?
答:析構函數也是特殊的類成員函數,它沒有返回類型,沒有參數,不能隨意調用,也沒有重載。只是在類對象生命期結束的時候,由系統自動調用釋放在構造函數中分配的
資源。這種在運行時,能依據其類型確認調用那個函數的能力稱為多態性,或稱遲后聯編。另: 析構函數一般在對象撤消前做收尾工作,比如回收內存等工作,虛擬函數的功能是使子類可以用同名的函數對父類函數進行覆蓋,并且在調用時自動調用子類覆蓋函數,如果是純虛函數,則純粹是為了在子類覆蓋時有個統一的命名而已。
注意:子類重新定義父類的虛函數的做法叫覆蓋,override,而不是overload(重載),重載的概念不屬于面向對象編程,重載指的是存在多個同名函數,這些函數的參數表不同..重載是在編譯期間就決定了的,是靜態的,因此,重載與多態無關.與面向對象編程無關.含有純虛函數的類稱為抽象類,不能實例化對象,主要用作接口類//
23、全局變量和局部變量有什么區別?是怎么實現的?操作系統和編譯器是怎么知道的?
答;全局變量的生命周期是整個程序運行的時間,而局部變量的生命周期則是局部函數或過程調用的時間段。其實現是由編譯器在編譯時采用不同內存分配方法。
全局變量在main函數調用后,就開始分配,靜態變量則是在main函數前就已經初始化了。
局部變量則是在用戶棧中動態分配的(還是建議看編譯原理中的活動記錄這一塊)
24、c語言 文件讀寫
#include "stdio.h"
main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w")==NULL)
{
printf("cann't open filen");
exit(0);
}
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
}
25、winsocket編程 ? //這個不錯
// 服務器代碼
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested; //版本號
WSADATA ?wsaData; ? ? ? ?//數據
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //建立套接字
SOCKADDR_IN addrSrv;?
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); ?//綁定端口
listen(sockSrv,5); ? //轉換socket套接子為偵聽套接子
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1) ? //無限循環
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprint(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf);
printf("%sn",recvBuf);
closesocket(sockConn);
WSACleanup();
}
}
注:這是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在該工程的Setting的Link的Object/library modules項要加入ws2_32.lib
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD ? ?wVersionRequested;
WSADATA ? wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData); //啟動winsock Dll
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%sn",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
注:這是Client端;File->New->Win32 Console Application,工程名:TcpClient;然后,File->New->C++ Source File,文件名:TcpClient;同理,在該工程的Setting的Link的Object/library modules項要加入ws2_32.lib
26、 類的知識 (非常不錯的一道題目)..
C++
#include <iostream.h>
class human
{
public:
human(){ human_num++;}; //默認構造函數
static int human_num; ? ? //靜態成員
~human()
{
human_num--;
print();
}
void print() ? ? ? ? ? ? //
{
cout<<"human num is: "<<human_num<<endl;
}
protected:
private:
};
int human::human_num = 0; ? //類中靜態數據成員在外部定義,僅定義一次
human f1(human x)
{
x.print();
return x;
}
int main(int argc, char* argv[])
{
human h1; //調用默認構造函數,human_num變為1
h1.print(); // 打印Human_man:1
human h2 = f1(h1); //先調用函數f1(),輸出human_num:1,而后輸出human_num為0,
h2.print();//打印輸出:human_num:0
return 0;
} //依次調用兩個析構函數:輸出:human_num:-1,human_num:-2;
輸出:
1
1
0
0
-1
-2
----------------------------
分析:
human h1; //調用構造函數,---hum_num = 1;
h1.print(); //輸出:"human is 1"
human h2 = f1(h1); //再調用f1(h1)的過程中,由于函數參數是按值傳遞對象,調用默認的復制構造函數,h2并沒有調用定義的構造函數.





總結

以上是生活随笔為你收集整理的笔试总结2(整理 觉得比较好的)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。