筆試題

1.是不是一個父類寫了一個virtual 函數,如果子類覆蓋它的函數不加virtual ,也能實現多態?

virtual修飾符會被隱形繼承的。private 也被集成,只事派生類沒有訪問權限而已。virtual可加可不加。子類的空間里有父類的所有變量(static除外)同一個函數只存在一個實體(inline除外)。子類覆蓋它的函數不加virtual ,也能實現多態。在子類的空間里,有父類的私有變量。私有變量不能直接訪問。

2.輸入一個字符串,將其逆序后輸出。(使用C++,不建議用偽碼)

#include <iostream>
using namespace std;


void main()
{
char a[50];memset(a,0,sizeof(a));
int i=0,j;
char t;
cin.getline(a,50,'\n');
for(i=0,j=strlen(a)-1;i<strlen(a)/2;i++,j--)
{
?? t=a[i];
????? a[i]=a[j];
?? a[j]=t;
}
cout<<a<<endl;
}

//第二種

string str;
cin>>str;
str.replace;
cout<<str;

3.請簡單描述Windows內存管理的方法。

內存管理是操作系統中的重要部分,兩三句話恐怕誰也說不清楚吧~~
我先說個大概,希望能夠拋磚引玉吧

當程序運行時需要從內存中讀出這段程序的代碼。代碼的位置必須在物理內存中才能被運行,由于現在的操作系統中有非常多的程序運行著,內存中不能夠完全放下,所以引出了虛擬內存的概念。把哪些不常用的程序片斷就放入虛擬內存,當需要用到它的時候在load入主存(物理內存)中。這個就是內存管理所要做的事。內存管理還有另外一件事需要做:計算程序片段在主存中的物理位置,以便CPU調度。

內存管理有塊式管理,頁式管理,段式和段頁式管理。現在常用段頁式管理

塊式管理:把主存分為一大塊、一大塊的,當所需的程序片斷不在主存時就分配一塊主存空間,把程 序片斷load入主存,就算所需的程序片度只有幾個字節也只能把這一塊分配給它。這樣會造成很大的浪費,平均浪費了50%的內存空間,但時易于管理。

頁式管理:把主存分為一頁一頁的,每一頁的空間要比一塊一塊的空間小很多,顯然這種方法的空間利用率要比塊式管理高很多。

段式管理:把主存分為一段一段的,每一段的空間又要比一頁一頁的空間小很多,這種方法在空間利用率上又比頁式管理高很多,但是也有另外一個缺點。一個程序片斷可能會被分為幾十段,這樣很多時間就會被浪費在計算每一段的物理地址上(計算機最耗時間的大家都知道是I/O吧)。

段頁式管理:結合了段式管理和頁式管理的優點。把主存分為若干頁,每一頁又分為若干段。好處就很明顯,不用我多說了吧。

各種內存管理都有它自己的方法來計算出程序片斷在主存中的物理地址,其實都很相似。

這只是一個大概而已,不足以說明內存管理的皮毛。無論哪一本操作系統書上都有詳細的講解

4.
#include "stdafx.h"
#define SQR(X) X*X

int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;

a /= SQR(k+m)/SQR(k+m);
printf("%d\n",a);?

return 0;
}
這道題目的結果是什么啊?

define 只是定義而已,在編擇時只是簡單代換X*X而已,并不經過算術法則的

a /= (k+m)*(k+m)/(k+m)*(k+m);
=>a /= (k+m)*1*(k+m);
=>a = a/9;
=>a = 1;是錯的

SQR(k+m)/SQR(k+m)= k+m*k+m/k+m*k+m正確

5.
const 符號常量;
(1)const char *p
(2)char const *p
(3)char * const p
說明上面三種描述的區別;

如果const位于星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;
如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。

(1)const char *p

一個指向char類型的const對象指針,p不是常量,我們可以修改p的值,使其指向不同的char,但是不能改變它指向非char對象,如:
const char *p;
char c1='a';
char c2='b';
p=&c1;//ok
p=&c2;//ok
*p=c1;//error
(3)char * const p

此時*p可以修改,而p不能修改。

(4)const char * const p
這種是地址及指向對象都不能修改。

6.下面是C語言中兩種if語句判斷方式。請問哪種寫法更好?為什么?
int n;
if (n == 10) // 第一種判斷方式
if (10 == n) // 第二種判斷方式

如果少了個=號,編譯時就會報錯,減少了出錯的可能行,可以檢測出是否少了=

7.下面的代碼有什么問題?
void DoSomeThing(...)
{
char* p;
...
p = malloc(1024); // 分配1K的空間
if (NULL == p)
return;
...
p = realloc(p, 2048); // 空間不夠,重新分配到2K
if (NULL == p)
return;
...
}

A:
p = malloc(1024);???? 應該寫成: p = (char *) malloc(1024);
??????? 沒有釋放p的空間,造成內存泄漏。

8.下面的代碼有什么問題?并請給出正確的寫法。
void DoSomeThing(char* p)
{
char str[16];
int n;
assert(NULL != p);
scanf(p, "%s%d", str, n);
if (0 == strcmp(str, "something"))
{
...
}
}

A:
sscanf(p, "%s%d", str, n);?? 這句該寫成: sscanf(p, "%s%d", str, &n);

9.下面代碼有什么錯誤?
Void test1()
{
char string[10];
char *str1="0123456789";
strcpy(string, str1);
}?

數組越界

--------------------------------------------------------------------------
10.下面代碼有什么問題?
Void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
???? str1[i] ='a';
}
strcpy(string, str1);
}?

數組越界

11.下面代碼有什么問題?
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
??? strcpy(string, str1);
}
}?

==數組越界
==strcpy拷貝的結束標志是查找字符串中的\0 因此如果字符串中沒有遇到\0的話 會一直復制,直到遇到\0,上面的123都因此產生越界的情況
建議使用 strncpy 和 memcpy

12.下面代碼有什么問題?

#define MAX_SRM 256?

DSN get_SRM_no()
{
static int SRM_no; //是不是這里沒賦初值?
int I;
for(I=0;I<MAX_SRM;I++,SRM_no++)
{
??? SRM_no %= MAX_SRM;
??? if(MY_SRM.state==IDLE)
??? {
????? break;
??? }
}
if(I>=MAX_SRM)
??? return (NULL_SRM);
else
??? return SRM_no;
}?

系統會初始化static int變量為0,但該值會一直保存,所謂的不可重入...
13.寫出運行結果:
{// test1
??? char str[] = "world"; cout << sizeof(str) << ": ";
??? char *p??? = str;???? cout << sizeof(p) << ": ";
??? char i???? = 10;????? cout << sizeof(i) << ": ";
??? void *pp?? = malloc(10); cout << sizeof(p) << endl;
}

6:4:1:4


14.寫出運行結果:
{// test2
??? union V {
struct X {
?? unsigned char s1:2;
?? unsigned char s2:3;
?? unsigned char s3:3;
} x;

unsigned char c;
??? } v;

??? v.c = 100;
??? printf("%d", v.x.s3);?

}

3

15.用C++寫個程序,如何判斷一個操作系統是16位還是32位的?不能用sizeof()函數

A1:
16位的系統下,
int i = 65536;
cout << i; // 輸出0;
int i = 65535;
cout << i; // 輸出-1;

32位的系統下,
int i = 65536;
cout << i; // 輸出65536;
int i = 65535;
cout << i; // 輸出65535;

A2:

int a = ~0;
if( a>65536 )
{
??? cout<<"32 bit"<<endl;
}
else
{
??? cout<<"16 bit"<<endl;
}

16.C和C++有什么不同?

從機制上:c是面向過程的(但c也可以編寫面向對象的程序);c++是面向對象的,提供了類。但是,
c++編寫面向對象的程序比c容易

從適用的方向:c適合要求代碼體積小的,效率高的場合,如嵌入式;c++適合更上層的,復雜的; llinux核心大部分是c寫的,因為它是系統軟件,效率要求極高。

從名稱上也可以看出,c++比c多了+,說明c++是c的超集;那為什么不叫c+而叫c++呢,是因為c++比
c來說擴充的東西太多了,所以就在c后面放上兩個+;于是就成了c++

C語言是結構化編程語言,C++是面向對象編程語言。
C++側重于對象而不是過程,側重于類的設計而不是邏輯的設計。

17.在不用第三方參數的情況下,交換兩個參數的值
#include <stdio.h>

void main()
{
??????? int i=60;
??????? int j=50;
??????? i=i+j;
??????? j=i-j;
??????? i=i-j;
??????? printf("i=%d\n",i);
??????? printf("j=%d\n",j);
}

方法二:
i^=j;
j^=i;
i^=j;

方法三:
// 用加減實現,而且不會溢出
a = a+b-(b=a)

18.有關位域的面試題(為什么輸出的是一個奇怪的字符)

a.t = 'b';效果相當于 a.t= 'b' & 0xf;

'b' --> 01100010
'b' & 0xf -->>00000010
所以輸出Ascii碼為2的特殊字符

char t:4;就是4bit的字符變量,同樣
unsigned short i:8;就是8bit的無符號短整形變量

19.int i=10, j=10, k=3; k*=i+j; k最后的值是?60
20.進程間通信的方式有?

進程間通信的方式有 共享內存, 管道 ,Socket ,消息隊列 , DDE等

21.
struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
sizeof(A)=?(不考慮邊界對齊)

8

struct CELL???????????? // Declare CELL bit field
{
?? unsigned character : 8; // 00000000 ????????
?? unsigned foreground : 3; // 00000??? 00000000
?? unsigned intensity : 1; // 0000?000 00000000
?? unsigned background : 3; // 0???0000 00000000
?? unsigned blink????? : 1; // ?0000000 00000000
} screen[25][80];?????? // Array of bit fields
二、位結構
??? 位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構
比按位運算符更加方便。
??? 位結構定義的一般形式為:
???? struct位結構名{
????????? 數據類型 變量名: 整型常數;
????????? 數據類型 變量名: 整型常數;
???? } 位結構變量;?

?其中: 數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整 數, 范圍是0~15, 表示二進制位的個數, 即表示有多少位。 變量名是選擇項, 可以不命名, 這樣規定是為了排列需要。
??? 例如: 下面定義了一個位結構。
???? struct{
????????? unsigned incon: 8; /*incon占用低字節的0~7共8位*/
????????? unsigned txcolor: 4;/*txcolor占用高字節的0~3位共4位*/
????????? unsigned bgcolor: 3;/*bgcolor占用高字節的4~6位共3位*/
????????? unsigned blink: 1; /*blink占用高字節的第7位*/
???? }ch;
??? 位結構成員的訪問與結構成員的訪問相同。
??? 例如: 訪問上例位結構中的bgcolor成員可寫成:
????? ch.bgcolor

??? 注意:
??? 1. 位結構中的成員可以定義為unsigned, 也可定義為signed,
但當成員長度為1時, 會被認為是unsigned類型。因為單個位不可能具有符號。
??? 2
. 位結構中的成員不能使用數組和指針, 但位結構變量可以是數組和指針,
如果是指針, 其成員訪問方式同結構指針。
??? 3.
位結構總長度(位數), 是各個位成員定義的位數之和, 可以超過兩個字節。
??? 4. 位結構成員可以與其它結構成員一起使用。
??? 例如:
???? struct info{
????????? char name[8];
????????? int age;
????????? struct addr address;
????????? float pay;
????????? unsigned state: 1;
????????? unsigned pay: 1;
????????? }workers;
上例的結構定義了關于一個工人的信息。其中有兩個位結構成員, 每個位結構成員只有一位, 因此只占一個字節但保存了兩個信息, 該字節中第一位表示工 人的狀態, 第二位表示工資是否已發放。由此可見使用位結構可以節省存貯空間。
22.下面的函數實現在一個固定的數上加上一個數,有什么錯誤,改正
int add_n(int n)
{
static int i=100;
i+=n;
return i;
}?

答:因為static使得i的值會保留上次的值。
去掉static就可了
23.下面的代碼有什么問題?
class A
{
public:
A() { p=this; }
~A() { if(p!=NULL) { delete p; p=NULL; } }?

A* p;
};

答:會引起無限遞歸

24.
union a {
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;

};

輸出cout<<sizeof(c)<<endl;的結果?

答:
VC6環境下得出的結果是32

另:
我(sun)在VC6.0+win2k下做過試驗:
short – 2,int-4,float-4,double-8,指針-4

sizeof(union),以結構里面size最大的為union的size

25.

int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;

答:i = 5

26.
unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;
*(array + i) = ?

答:4

27.
class A
{
virtual void func1();
void func2();
}
Class B: class A
{
void func1(){cout << "fun1 in class B" << endl;}
virtual void func2(){cout << "fun2 in class B" << endl;}
}
A, A中的func1和B中的func2都是虛函數.
B, A中的func1和B中的func2都不是虛函數.
C, A中的func2是虛函數.,B中的func1不是虛函數.
D, A中的func2不是虛函數,B中的func1是虛函數.

答:A

28.
數據庫:抽出部門,平均工資,要求按部門的字符串順序排序,不能含有"human resource"部門,

employee結構如下:employee_id, employee_name, depart_id,depart_name,wage

答:select depart_name, avg(wage)
from employee
where depart_name <> 'human resource'
group by depart_name
order by depart_name

29.
給定如下SQL數據庫:Test(num INT(4)) 請用一條SQL語句返回num的最小值,但不許使用統計功能,如MIN,MAX等

答:
select top 1 num
from Test
order by num desc

31.
試編寫函數判斷計算機的字節存儲順序是開序(little endian)還是降序(bigendian)

答:
bool IsBigendian()
{
unsigned short usData = 0x1122;
unsigned char *pucData = (unsigned char*)&usData;

return (*pucData == 0x22);
}

32.簡述Critical Section和Mutex的不同點
對幾種同步對象的總結
1.Critical Section
A.速度快B.不能用于不同進程
C.不能進行資源統計(每次只可以有一個線程對共享資源進行存取)

2.Mutex
A.速度慢B.可用于不同進程C.不能進行資源統計

3.Semaphore
A.速度慢B.可用于不同進程
C.可進行資源統計(可以讓一個或超過一個線程對共享資源進行存取)

4.Event
A.速度慢B.可用于不同進程C.可進行資源統計
33.一個數據庫中有兩個表:
一張表為Customer,含字段ID,Name;
一張表為Order,含字段ID,CustomerID(連向Customer中ID的外鍵),Revenue;
寫出求每個Customer的Revenue總和的SQL語句。

建表
create table customer
(
ID int primary key,Name char(10)
)

go

create table [order]
(
ID int primary key,CustomerID int foreign key references customer(id) , Revenue float
)

go

--查詢
select Customer.ID, sum( isnull([Order].Revenue,0) )
from customer full join [order]
on( [order].customerid=customer.id )
group by customer.id
35.程序改錯
class mml
{
private:
??? static unsigned int x;
public:
??? mml(){ x++; }
??? mml(static unsigned int &) {x++;}
??? ~mml{x--;}
pulic:
??? virtual mon() {} = 0;
??? static unsigned int mmc(){return x;}
??? ......?????????????????????
};
class nnl:public mml
{
private:
??? static unsigned int y;
public:
??? nnl(){ x++; }
??? nnl(static unsigned int &) {x++;}
??? ~nnl{x--;}
public:
??? virtual mon() {};
???? static unsigned int nnc(){return y;}
??? ......??????????????????
};

代碼片斷:
mml* pp = new nnl;
..........
delete pp;
A:
基類的析構函數應該為虛函數
virtual ~mml{x--;}
36.101個硬幣100真、1假,真假區別在于重量。請用無砝碼天平稱兩次給出真幣重還是假幣重的結論。

答:101個先取出2堆,
33,33
第一次稱,如果不相等,說明有一堆重或輕
那么把重的那堆拿下來,再放另外35個中的33
如果相等,說明假的重,如果不相等,新放上去的還是重的話,說明假的輕(不可能新放上去的輕)

第一次稱,如果相等的話,這66個肯定都是真的,從這66個中取出35個來,與剩下的沒稱過的35個比
下面就不用說了

方法二:
第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個和真的比一下。如果不一樣,就拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在B(50)中,不一樣就在A(50)中,結合第一次的結果就知道了。

37.static變量和static 函數各有什么特點?

答:static變量:在程序運行期內一直有效,如果定義在函數外,則在編譯單元內可見,如果在函數內,在在定義的block內可見;static函數:在編譯單元內可見;

38.用C 寫一個輸入的整數,倒著輸出整數的函數,要求用遞歸方法 ;

答:void fun( int a )
{
printf( "%d", a%10 );
a /= 10;
if( a <=0 ) return;

fun( a );
}

40.int id[sizeof(unsigned long)];
??? 這個對嗎?為什么??

答:對。這個 sizeof是編譯時運算符,編譯時就確定了
可以看成和機器有關的常量。

求下面函數的返回值( 微軟)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:將x轉化為2進制,看含有的1的個數。
2. 什么是“引用”?申明和使用“引用”要注意哪些問題?
答:引用就是某個目標變量的“別名”(alias),對應用的操作與對變量直接操作效果完全相同。申明一個引用的時候,
切記要對其進行初始化。引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。不能建立數組的引用。
3. 將“引用”作為函數參數有哪些特點?
(1)傳遞引用給函數與傳遞指針的效果是一樣的。這時,被調函數的形參就成為原來主調函數中的實參變量或對象的一個別名來使用,所以在被調函數中對形參變量的操作就是對其相應的目標對象(在主調函數中)的操作。
(2)使用引用傳遞函數的參數,
在內存中并沒有產生實參的副本,它是直接對實參操作;而使用一般變量傳遞函數的參數,當發生函數調用時,需要給形參分配存儲單元,形參變量是實參變量的副本;如果傳遞的是對象,還將調用拷貝構造函數。因此,當參數傳遞的數據較大時,用引用比用一般變量傳遞參數的效率和所占空間都好。
(3)使用指針作為函數的參數雖然也能達到與使用引用的效果,但是
,在被調函數中同樣要給形參分配存儲單元,且需要重復使用"*指針變量名"的形式進行運算,這很容易產生錯誤且程序的閱讀性較差;另一方面,在主調函數的調用點處,必須用變量的地址作為實參。而引用更容易使用,更清晰。
4. 在什么時候需要使用“常引用”? 
如果既要利用引用提高程序的效率,又要保護傳遞給函數的數據不在函數中被改變,就應使用常引用。常引用聲明方式:const 類型標識符 &引用名=目標變量名;
int a ; const int &ra=a;
ra=1; //錯誤 a=1; //正確
string foo( ); void bar(string & s);
那么下面的表達式將是非法的:
bar(foo( )); bar("hello world");
原因在于foo( )和"hello world"串都會產生一個臨時對象,而在C++中,這些臨時對象都是const類型的。因此上面的表達式就是
試圖將一個const類型的對象轉換為非const類型,這是非法的。
引用型參數應該在能被定義為const的情況下,盡量定義為const 。
5. 將“
引用”作為函數返回值類型的格式、好處和需要遵守的規則?
格式:類型標識符 &函數名(形參列表及類型說明){ //函數體 }
好處:
在內存中不產生被返回值的副本;(注意:正是因為這點原因,所以返回一個局部變量的引用是不可取的。因為隨著該局部變量生存期的結束,相應的引用也會失效,產生runtime error!
注意事項:
(1)不能返回局部變量的引用。這條可以參照Effective C++[1]的Item 31。主要原因是局部變量會在函數返回后被銷毀,因此被返回的引用就成為了"無所指"的引用,程序會進入未知狀態。
(2)不能返回函數內部new分配的內存的引用。 這條可以參照Effective C++[1]的Item 31。雖然不存在局部變量的被動銷毀問題,可對于這種情況(返回函數內部new分配內存的引用),又面臨其它尷尬局面。例如,被函數返回的引用只是作為一 個臨時變量出現,而沒有被賦予一個實際的變量,那么這個引用所指向的空間(由new分配)就無法釋放,造成memory leak。
(3)可以返回類成員的引用,但最好是const。這條原則可以參照Effective C++[1]的Item 30。主要原因是當對象的屬性是與某種業務規則(business rule)相關聯的時候,其賦值常常與某些其它屬性或者對象的狀態有關,因此有必要將賦值操作封裝在一個業務規則當中。如果其它對象可以獲得該屬性的非常量引用(或指針),那么對該屬性的單純賦值就會破壞業務規則的完整性。
(4)流操作符重載返回值申明為“引用”的作用:
流操作符<<和>>,這兩個操作符常常希望被連續使用,例如:cout << "hello" << endl; 因此這兩個操作符的返回值應該是一個仍然支持這兩個操作符的流引用。可選的其它方案包括:返回一個流對象和返回一個流對象指針。但是對于返回一個流對象,程序必須重新(拷貝)構造一個新的流對象,也就是說,連續的兩個<<操作符實際上是針對不同對象的!這無法讓人接受。對于返回一個流指針則不能連續使用<<操作符。 因此,返回一個流對象引用是惟一選擇。這個唯一選擇很關鍵,它說明了引用的重要性以及無可替代性,也許這就是C++語言中引入引用這個概念的原因吧。 賦值操作符=。這個操作符象流操作符一樣,是可以連續使用的,例如:x = j = 10;或者(x=10)=100;賦值操作符的返回值必須是一個左值,以便可以被繼續賦值。因此引用成了這個操作符的惟一返回值選擇。 ?
#include <iostream.h>
int &put(int n);
int vals[10];
int error=-1;
void main()
{
put(0)=10; //以put(0)函數值作為左值,等價于????????????????????????? //vals[0]=10;
put(9)=20; //以put(9)函數值作為左值,等價于? //vals[9]=20;
cout<<vals[0];
cout<<vals[9];
}
int &put(int n)
{
if (n>=0 && n <=9 ) return vals[n];
else { cout<<"subscript error"; return error; }
}
(5)在另外的一些操作符中,卻千萬不能返回引用:
+-*/ 四則運算符。它們不能返回引用,Effective C++[1]的Item23詳細的討論了這個問題。主要原因是這四個操作符沒有side effect,因此,它們必須構造一個對象作為返回值,可選的方案包括:返回一個對象、返回一個局部變量的引用,返回一個new分配的對象的引用、返回一 個靜態對象引用。根據前面提到的引用作為返回值的三個規則,第2、3兩個方案都被否決了。靜態對象的引用又因為((a+b) == (c+d))會永遠為true而導致錯誤。所以可選的只剩下返回一個對象了。
6. “引用”與多態的關系?
引用是除指針外另一個可以產生多態效果的手段。這意味著,一個基類的引用可以指向它的派生類實例。
Class A; Class B : Class A{...}; B b;
A & ref = b;
7. “引用與指針的區別是什么?
指針通過某個指針變量指向一個對象后,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;
而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作。此外,就是上面提到的對函數傳ref和pointer的區別。
8. 什么時候需要引用
流操作符<<和>>、賦值操作符=的返回值、拷貝構造函數的參數、賦值操作符=的參數、其它情況都推薦使用引用。
以上 2-8 參考http://blog.csdn.net/ysuncn/archive/2007/09/16/1787380.aspx
9. 結構與聯合有和區別?
1. 結構和聯合都是由多個不同的數據類型成員組成, 但在任何同一時刻,
聯合中只存放了一個被選中的成員(所有成員共用一塊地址空間), 而結構的所有成員都存在(不同成員的存放地址不同)。
2.
對于聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構的不同成員賦值是互不影響的。
10. 下面關于聯合的題目的輸出?
a)
#i nclude <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266 (低位低地址,高位高地址,內存占用情況是Ox010A)
b)
main()
{
union{ /*定義一個聯合*/
int i;
struct{ /*在聯合中定義一個結構*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*聯合成員賦值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first='a'; /*聯合中結構成員賦值*/
number.half.second='b';
printf("%x\n", number.i);
getch();
}
答案: AB (0x41對應'A',是低位;Ox42對應'B',是高位)
6261 (number.i和number.half共用一塊地址空間)
11. 已知strcpy的函數原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不調用C++/C 的字符串庫函數,請編寫函數 strcpy

答案:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’) ;
return tempptr ;
}
12. 已知String類定義如下:
class String
{
public:
String(const char *str = NULL); // 通用構造函數
String(const String &another); // 拷貝構造函數
~ String(); // 析構函數
String & operater =(const String &rhs); // 賦值函數
private:
char *m_data; // 用于保存字符串
};
嘗試寫出類的成員函數實現
答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen在參數為NULL時會拋異常才會有這步判斷
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data; //刪除原來的數據,新開一塊內存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
String::~String()
{
delete []m_data ;
}
13. .h頭文件中的ifndef/define/endif 的作用?
答:防止該頭文件被重復引用。
14. i nclude<file.h> 與 #i nclude "file.h"的區別?
答:前者是從Standard Library的路徑尋找和引用file.h,而后者是從當前工作路徑搜尋并引用file.h。
15.C++ 程序中調用被C 編譯器編譯后的函數,為什么要加extern “C”
首先,作為extern是C/C++語言中表明
函數和全局變量作用范圍(可見性)的關鍵字該關鍵字告訴編譯器,其聲明的函數和變量可以在本模塊或其它模塊中使用
extern "C"是連接申明(linkage declaration),extern "C"修飾的變量和函數是按照C語言方式編譯和連接的,來看看C++中對類似C的函數是怎樣編譯的:
作為一種面向對象的語言,
C++支持函數重載,而過程式語言C則不支持。函數被C++編譯后在符號庫中的名字與C語言的不同。例如,假設某個函數的原型為:
void foo( int x, int y );
該函數被
C編譯器編譯后在符號庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。
_foo_int_int 這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。例如,在C++中,函數void foo( int x, int y )void foo( int x, float y )編譯生成的符號是不相同的,后者為_foo_int_float
同 樣地,
C++中的變量除支持局部變量外,還支持類成員變量和全局變量。用戶所編寫程序的類成員變量可能與全局變量同名,我們以"."來區分。而本質上,編 譯器在進行編譯時,與函數的處理相似,也為類中的變量取了一個獨一無二的名字,這個名字與用戶程序中同名的全局變量名字不同。
未加
extern "C"聲明時的連接方式
假設在
C++中,模塊A的頭文件如下:
// 模塊A頭文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif  
在模塊
B中引用該函數:
// 模塊B實現文件 moduleB.cpp
include "moduleA.h"
foo(2,3);
實際上,在連接階段,連接器會從模塊
A生成的目標文件moduleA.obj中尋找_foo_int_int這樣的符號!
extern "C"聲明后的編譯和連接方式
extern "C"聲明后,模塊A的頭文件變為:
// 模塊A頭文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif  
在模塊
B的實現文件中仍然調用foo( 2,3 ),其結果是:
1)模塊A編譯生成foo的目標代碼時,沒有對其名字進行特殊處理,采用了C語言的方式;
2)連接器在為模塊B的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo
如果在模塊
A中函數聲明了fooextern "C"類型,而模塊B中包含的是extern int foo( int x, int y ) ,則模塊B找不到模塊A中的函數;反之亦然。
所 以,可以用一句話概括
extern “C”這個聲明的真實目的(任何語言中的任何語法特性的誕生都不是隨意而為的,來源于真實世界的需求驅動。我們在思考問題時,不能只停留在這個語言是怎么做的,還要問一問它為什么要這么做,動機是什么,這樣我們可以更深入地理解許多問題):實現C++C及其它語言的混合編程。
明白了
C++extern "C"的設立動機,我們下面來具體分析extern "C"通常的使用技巧:extern "C"的慣用法(1)在C++中引用C語言中的函數和變量,在包含C語言頭文件(假設為cExample.h)時,需進行下列處理:
extern "C"
{
include "cExample.h"
}
而在
C語言的頭文件中,對其外部函數只能指定為extern類型,C語言中不支持extern "C"聲明,在.c文件中包含了extern "C"時會出現編譯語法錯誤。
C++引用C函數例子工程中包含的三個文件的源代碼如下:
/* c語言頭文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif

/* c語言實現文件:cExample.c */
include "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++實現文件,調用addcppFile.cpp
extern "C"
{

i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果
C++調用一個C語言編寫的.DLL時,當包括.DLL的頭文件或聲明接口函數時,應加extern "C" { }

2)在C中引用C++語言中的函數和變量時,C++的頭文件需添加extern "C",但是在C語言中不能直接引用聲明了extern "C"的該頭文件,應該僅將C文件中將C++中定義的extern "C"函數聲明為extern類型。
C引用C++函數例子工程中包含的三個文件的源代碼如下:
//C++頭文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif

//C++實現文件 cppExample.cpp
include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C實現文件 cFile.c
/* 這樣會編譯出錯:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
15題目的解答請參考C++中extern “C”含義深層探索注解

16. 關聯、聚合(Aggregation)以及組合(Composition)的區別?
涉及到UML中的一些概念:關聯是表示兩個類的一般性聯系,比如“學生”和“老師”就是一種關聯關系;聚合表示has-a的關系,是一種相對松散的關系,聚合類不需要對被聚合類負責,如下圖所示,用空的菱形表示聚合關系:
<!--[if !vml]--><!--[endif]-->
從實現的角度講,聚合可以表示為:
class A {...} class B { A* a; .....}
組合表示contains-a的關系,關聯性強于聚合:組合類與被組合類有相同的生命周期,組合類要對被組合類負責,采用實心的菱形表示組合關系:
<!--[if !vml]--><!--[endif]-->
實現的形式是:
class A{...} class B{ A a; ...}
參考文章:http://blog.csdn.net/wfwd/archive/2006/05/30/763753.aspx
http://blog.csdn.net/wfwd/archive/2006/05/30/763760.aspx
17.面向對象的三個基本特征,并簡單敘述之?
1. 封裝:將客觀事物抽象成類,每個類對自身的數據和方法實行protection(private, protected,public)
2. 繼承:廣義的繼承有三種實現形式:實現繼承(指使用基類的屬性和方法而無需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實現代碼)、接口繼承(僅使用屬性和方法,實現滯后到子類實現)。前兩種(類繼承)和后一種(對象組合=>接口繼承以及純虛函數)構成了功能復用的兩種方式。
3. 多態:是將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
18. 重載(overload)和重寫(overried,有的書也叫做覆蓋)的區別?
常考的題目。從定義上來說:
重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
重寫:是指子類重新定義復類虛函數的方法。
從實現原理上來說:
重載:編譯器根據函數不同的參數表,對同名函數的名稱
做修飾,然后這些同名函數就成了不同的函數(至少對于編譯器來說是這樣的)。如,有兩個同名函數:function func(p:integer):integer;和function func(p:string):integer;。那么編譯器做過修飾后的函數名稱可能是這樣的:int_func、str_func。對于這兩個函數的調用,在編譯器間就已經確定了,是靜態的。也就是說,它們的地址在編譯期就綁定了(早綁定),因此,重載和多態無關
重寫:和多態真正相關。當子類重新定義了父類的虛函數后,父類指針根據賦給它的不同的子類指針,動態的調用屬于子類的該函數,這樣的函數調用在編譯期間是無法確定的(調用的子類的虛函數的地址無法給出)。因此,這樣的函數地址是在運行期綁定的(晚綁定)。
19. 多態的作用?
主要是兩個:1. 隱藏實現細節,使得代碼能夠模塊化;擴展代碼模塊,實現代碼重用;2. 接口重用:為了類在繼承和派生的時候,保證使用家族中任一類的實例的某一屬性時的正確調用
20. AdoAdo.net的相同與不同?
除 了“能夠讓應用程序處理存儲于DBMS 中的數據“這一基本相似點外,兩者沒有太多共同之處。但是Ado使用OLE DB 接口并基于微軟的COM 技術,而ADO.NET 擁有自己的ADO.NET 接口并且基于微軟的.NET 體系架構。眾所周知.NET 體系不同于COM 體系,ADO.NET 接口也就完全不同于ADO和OLE DB 接口,這也就是說ADO.NET 和ADO是兩種數據訪問方式。ADO.net 提供對XML 的支持。
21. New delete malloc free 的聯系與區別?
答案:都是在堆(heap)上進行動態的內存操作。用malloc函數需要指定內存分配的字節數并且不能初始化對象,new 會自動調用對象的構造函數。delete 會調用對象的destructor,而free 不會調用對象的destructor.
23. 有哪幾種情況只能用intialization list 而不能用assignment?
答案:當類中含有const、reference 成員變量;基類的構造函數都需要初始化表。
24. C++是不是類型安全的?
答案:不是。兩個不同類型的指針之間可以強制轉換(用reinterpret cast)。C#是類型安全的。
25. main 函數執行以前,還會執行什么代碼?
答案:
全局對象的構造函數會在main 函數之前執行。
26. 描述內存分配方式以及它們的區別?
1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,
static 變量
2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
3) 從堆上分配亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但問題也最多。
27.struct class 的區別
答案:struct 的成員默認是公有的,而類的成員默認是私有的。struct 和 class 在其他方面是功能相當的。
從 感情上講,大多數的開發者感到類和結構有很大的差別。感覺上結構僅僅象一堆缺乏封裝和功能的開放的內存位,而類就象活的并且可靠的社會成員,它有智能服 務,有牢固的封裝屏障和一個良好定義的接口。既然大多數人都這么認為,那么只有在你的類有很少的方法并且有公有數據(這種事情在良好設計的系統中是存在 的!)時,你也許應該使用 struct 關鍵字,否則,你應該使用 class 關鍵字。
28.當一個類A 中沒有生命任何成員變量與成員函數,這時sizeof(A)的值是多少,如果不是零,請解釋一下編譯器為什么沒有讓它為零。(Autodesk
答案:肯定不是零。舉個反例,如果是零的話,聲明一個class A[10]對象數組,而每一個對象占用的空間是零,這時就沒辦法區分A[0],A[1]…了。
29. 8086 匯編下,邏輯地址和物理地址是怎樣轉換的?(Intel
答案:通用寄存器給出的地址,是段內偏移地址,相應段寄存器地址*10H+通用寄存器內地址,就得到了真正要訪問的地址。
30. 比較C++中的4種類型轉換方式?
請參考:http://blog.csdn.net/wfwd/archive/2006/05/30/763785.aspx,重點是static_cast, dynamic_cast和reinterpret_cast的區別和應用。
31.分別寫出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)
32.請說出const#define 相比,有何優點?
答案:1)
const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。
2) 有些集成化的調試工具可以對
const 常量進行調試,但是不能對宏常量進行調試。
33.簡述數組與指針的區別?
數組要么在靜態存儲區被創建(如全局數組),要么在棧上被創建。指針可以隨時指向任意類型的內存塊。
(1)修改內容上的差別.
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 編譯器不能發現該錯誤,運行時錯誤
(2) 用運算符sizeof 可以計算出數組的容量(字節數)。
sizeof(p),p 為指針得到的是一個指針變量的字節數,而不是p 所指的內存容量。C++/C 語言沒有辦法知道指針所指的內存容量,除非在申請內存時記住它。注意當數組作為函數的參數進行傳遞時,該數組自動退化為同類型的指針。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12 字節
cout<< sizeof(p) << endl; // 4 字節
計算數組和指針的內存容量
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字節而不是100 字節
}

34.類成員函數的重載、覆蓋和隱藏區別?
a.成員函數被重載的特征:
(1)相同的范圍(在同一個類中);
(2)函數名字相同;
(3)參數不同;
(4)virtual 關鍵字可有可無。
b.覆蓋是指派生類函數覆蓋基類函數,特征是:
(1)不同的范圍(分別位于派生類與基類);
(2)函數名字相同;
(3)參數相同;
(4)基類函數必須有virtual 關鍵字。
c.“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)
35. There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
答案:( ( a + b ) + abs( a - b ) ) / 2
36. 如何打印出當前源文件的文件名以及源文件的當前行號?
cout << __FILE__ ;
cout<<__LINE__ ;
__FILE__和__LINE__是系統預定義宏,這種宏并不是在某個文件中定義的,而是由編譯器定義的。
37. main 主函數執行完畢后,是否可能會再執行一段代碼,給出說明?
答案:可以,可以用_onexit 注冊一個函數,它會在main 之后執行int fn1(void), fn2(void), fn3(void), fn4 (void);
void main( void )
{
String str("zhanglin");
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.\n" );
}
int fn1()
{
printf( "next.\n" );
return 0;
}
int fn2()
{
printf( "executed " );
return 0;
}
int fn3()
{
printf( "is " );
return 0;
}
int fn4()
{
printf( "This " );
return 0;
}
The _onexit function is passed the address of a function (func) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out) order. The functions passed to _onexit cannot take parameters.
38. 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的?
答案:
#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
39.文件中有一組整數,要求排序后輸出到另一個文件中
答案:
#include<iostream>
#include<fstream>
using namespace std;
void Order(vector<int>& data) //bubble sort
{
int count = data.size() ;
int tag = false ; // 設置是否需要繼續冒泡的標志位
for ( int i = 0 ; i < count ; i++)
{
for ( int j = 0 ; j < count - i - 1 ; j++)
{
if ( data[j] > data[j+1])
{
tag = true ;
int temp = data[j] ;
data[j] = data[j+1] ;
data[j+1] = temp ;
}
}
if ( !tag )
break ;
}
}

void main( void )
{
vector<int>data;
ifstream in("c:\\data.txt");
if ( !in)
{
cout<<"file error!";
exit(1);
}
int temp;
while (!in.eof())
{
in>>temp;
data.push_back(temp);
}
in.close(); //關閉輸入文件流
Order(data);
ofstream out("c:\\result.txt");
if ( !out)
{
cout<<"file error!";
exit(1);
}
for ( i = 0 ; i < data.size() ; i++)
out<<data
<<" ";
out.close(); //關閉輸出文件流
}
40. 鏈表題:一個鏈表的結點結構
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;

(1)已知鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel)
Node * ReverseList(Node *head) //鏈表逆序
{
if ( head == NULL || head->next == NULL )
return head;
Node *p1 = head ;
Node *p2 = p1->next ;
Node *p3 = p2->next ;
r />p1->next = NULL ;
while ( p3 != NULL )
{
p2->next = p1 ;
p1 = p2 ;
p2 = p3 ;
p3 = p3->next ;
}
p2->next = p1 ;
head = p2 ;
return head ;
}
(2)已知兩個鏈表head1 head2 各自有序,請把它們合并成一個鏈表依然有序。(保留所有結點,即便大小相同)
Node * Merge(Node *head1 , Node *head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
Node *p1 = NULL;
Node *p2 = NULL;
if ( head1->data < head2->data )
{
head = head1 ;
p1 = head1->next;
p2 = head2 ;
}
else
{
head = head2 ;
p2 = head2->next ;
p1 = head1 ;
}
Node *pcurrent = head ;
while ( p1 != NULL && p2 != NULL)
{
if ( p1->data <= p2->data )
{
pcurrent->next = p1 ;
pcurrent = p1 ;
p1 = p1->next ;
}
else
{
pcurrent->next = p2 ;
pcurrent = p2 ;
p2 = p2->next ;
}
}
if ( p1 != NULL )
pcurrent->next = p1 ;
if ( p2 != NULL )
pcurrent->next = p2 ;
return head ;
}
(3)已知兩個鏈表head1 head2 各自有序,請把它們合并成一個鏈表依然有序,這次要求用遞歸方法進行。 (Autodesk)
答案:
Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node *head = NULL ;
if ( head1->data < head2->data )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}

41. 分析一下這段程序的輸出 (Autodesk)
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i) //B(int) works as a converter ( int -> instance of B)
{
cout<<"constructed by parameter " << data <<endl;
}
private:
int data;
};
B Play( B b)
{
return b ;
}
(1) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形參析構
B t1 = Play(5); B t2 = Play(t1);   destructed t1形參析構
return 0;               destructed t2 注意順序!
} destructed t1
(2) results:
int main(int argc, char* argv[]) constructed by parameter 5
{ destructed B(5)形參析構
B t1 = Play(5); B t2 = Play(10);   constructed by parameter 10
return 0;               destructed B(10)形參析構
} destructed t2 注意順序!
42. 寫一個函數找出一個整數數組中,第二大的數 (microsoft
答案:
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data
> maxnumber )
{
sec_max = maxnumber ;
maxnumber = data ;
}
else
{
if ( data > sec_max )
sec_max = data ;
}
}
return sec_max ;
}
43. 寫一個在一個字符串(n)中尋找一個子串(m)第一個位置的函數。
KMP算法效率最好,時間復雜度是O(n+m)。
44. 多重繼承的內存分配問題:
比如有
class A : public class B, public class C {}
那么
A的內存結構大致是怎么樣的?這個是compiler-dependent的, 不同的實現其細節可能不同。
如果不考慮有虛函數、虛繼承的話就相當簡單;否則的話,相當復雜。
可以參考《深入探索C++對象模型》,或者:
http://blog.csdn.net/wfwd/archive/2006/05/30/763797.aspx
45. 如何判斷一個單鏈表是有環的?(注意不能用標志位,最多只能用兩個額外指針)
struct node { char val; node* next;}

bool check(const node* head) {} //return false : 無環;true: 有環
一種O(n)的辦法就是(搞兩個指針,一個每次遞增一步,一個每次遞增兩步,如果有環的話兩者必然重合,反之亦然):
bool check(const node* head)
{
if(head==NULL) return false;
node *low=head, *fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast) return true;
}
return false;
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458593.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FreeRTOS學習筆記——互斥型信號量

來自&#xff1a;http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系統中互斥型信號量是任務間資源保護的重要手段。下面結合一個具體例子說明FreeRTOS中的互斥型信號量如何使用。 【相關博文】 【FreeRTOS STM32移植筆記】 【FreeRTOS學習筆記…

JSP動態網站環境搭建應用中的詳細步驟(Tomcat和Apache/IIS的整合)

鏈接地址&#xff1a;http://www.cnblogs.com/dartagnan/archive/2011/03/25/2003426.html JSP動態網站環境搭建應用中的詳細步驟(Tomcat和Apache/IIS的整合)sun推出的JSP&#xff08;Java Server Pages&#xff09;是一種執行于服務器端的動態網頁開發技術&#xff0c;它基于J…

關于JS獲取select值的兩種實現方法

前幾天發了一篇關于javascript獲取select值的方法&#xff0c;后來發現有另一種實現方法&#xff0c;所以就都發出來比較一下&#xff1a; 方法一&#xff1a;通過獲取option標簽的value值來確定&#xff1a; <!DOCTYPE html> <html> <head><meta charset…

c語言題庫1

1. 用預處理指令#define 聲明一個常數&#xff0c;用以表明1年中有多少秒&#xff08;忽略閏年問題&#xff09; #define time (365*24*60*60) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365) 2. 寫一個“標準”宏MIN&#xff0c;這個宏輸入兩個參數并返回較小的一個。 #di…

FreeRTOS系列第19篇---FreeRTOS信號量

來自&#xff1a;http://blog.csdn.net/zhzht19861011/article/details/50835613 本文介紹信號量的基礎知識&#xff0c;詳細源碼分析見《FreeRTOS高級篇6---FreeRTOS信號量分析》 1.信號量簡介 FreeRTOS的信號量包括二進制信號量、計數信號量、互斥信號量&#xff08;以后簡稱…

mysql語法替換字符串

UPDATE ht_business_task SET url REPLACE ( url, &amp;, & )轉載于:https://www.cnblogs.com/lz20150121/p/5030739.html

POJ1274 The Perfect Stall(二分圖)

題意&#xff1a; 一些奶牛只有在特定的圍欄中才能產奶&#xff0c;要求合理安排使能產奶的奶牛數達到最大。 要點&#xff1a; 二分圖裸題&#xff0c;最近剛學了二分圖&#xff0c;看下面的參考博客&#xff0c;寫的比較好&#xff1a; 參考博客&#xff1a;匈牙利算法 15479…

藍牙HCI剖析(一)

來自&#xff1a;http://blog.csdn.net/xiaoxiaopengbo/article/details/51334257 一.HCI介紹 HCI提供了訪問bluetooth control的統一接口&#xff0c;通俗來講&#xff0c;就是定義了特定的格式來控制藍牙芯片來做相應的動作&#xff08;比如inquiry,connect,disconnect&#…

c語言題庫2

96. struct name1{ char str; short x; int num; } struct name2{ char str;0 1 2 3 int num; 4 5 6 7 short x; 8 9 10 11 } sizeof(struct name1)? sizeof(struct name2)? 8、12 97. 讀文件file1.txt的內容&#xff08;例如&#xff09;&#xff1a; 12 34 56 …

ASP.NET狀緩存Cache的應用-提高數據庫讀取速度

ASP.NET狀緩存Cache的應用-提高數據庫讀取速度 原文:ASP.NET狀緩存Cache的應用-提高數據庫讀取速度一、 Cache概述 既然緩存中的數據其實是來自數據庫的&#xff0c;那么緩存中的數據如何和數據庫進行同步呢&#xff1f;一般來說&#xff0c;緩存中應該存放改動不大或者對…

2016年學習Linux決心書(老男孩教育在線課程班第二期)

我經過這4-5個月的學習后&#xff0c;我一定要達到月薪20&#xff2b;&#xff0c;為了達到這個目標我要付出如下10大行動&#xff1a;1.提前預習上課內容2.上課認真聽講&#xff0c;做好上課筆記3.課后認真做總結&#xff0c;完善筆記5.反復做實驗&#xff0c;并寫實驗文檔6.學…

WPF XAML 從零開始認識XAML

來自&#xff1a;http://blog.csdn.net/aoshilang2249/article/details/44158403 剖析最簡單的XMAL代碼: [html] view plaincopy <Window x:Class"MyFirstApplication.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentati…

c語言題庫3

143. 枚舉元素本身由系統定義了一個表示序號的數值&#xff0c;從0 開始順序定義為0&#xff0c;1&#xff0c;2…。如在weekday中&#xff0c;sun值為0&#xff0c;mon值為1&#xff0c; …,sat值為6。 main(){  enum weekday  {   sun,mon,tue,wed,thu,fri,sat  } a,b…

入門級----測試的執行、環境的搭建、每日構建、測試記錄和跟蹤、回歸測試、測試總結和報告...

測試用例的準備&#xff0c;都是為了執行測試準備的。 測試環境的搭建 &#xff08;1&#xff09;測試數據&#xff1a;有些測試需要使用大批量的數據&#xff0c;例如容量測試、壓力測試等。根據產品的具體測試要求&#xff0c;可能需要在數據庫表插入大量的數據&#xff0c;準…

MFC讀取配置文件GetPrivateProfileString

VC中 3 個主要 寫入/讀取配置文件ini的函數&#xff1a;bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);寫入.ini文件&#xff1b;DWORDGetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpD…

UESTC 250 windy數 數位dp

題目鏈接 1 #include<bits/stdc.h>2 using namespace std;3 #define mem1(a) memset(a, -1, sizeof(a))4 #define ll long long5 int dp[20][20], digit[20], len;6 ll dfs(int len, int pre, bool fp, bool first) { //first表示前面的數是否全部為0&#xff0c; pr…

c語言面試題大全

C語言面試題大匯總 4. static有什么用途&#xff1f;&#xff08;請至少說明兩種&#xff09; 1.限制變量的作用域(DL:使其只在定義的當前文件中起作用&#xff0c;static是只能由與變量在同一個文件中定義的程序存取的全局變量。也就是說使全局變量成為文件的私有變量&#…

WindowsAPI詳解——GetCurrentDirectory 獲得程序當前目錄

每個Windows程序都有一個自己的當前目錄&#xff0c;默認是程序exe文件所在的目錄。系統在給程序加載動態鏈接庫文件(DLL)時先在程序當前目錄里查找要加載的DLL&#xff0c;如果在此目錄下沒有找到系統便會去Windows目錄下查找。在這兒我們主要將如何獲得程序的當前目錄&#x…

20151210小問題2

1、各瀏覽器下 scrollTop的差異 IE6/7/8&#xff1a; 對于沒有doctype聲明的頁面里可以使用 document.body.scrollTop 來獲取 scrollTop高度 &#xff1b; 對于有doctype聲明的頁面則可以使用 document.documentElement.scrollTop&#xff1b; Safari: safari 比較特別&#x…

限制MySQL Binlog的傳輸速率

最近一臺核心庫備庫完成恢復后打開slave&#xff0c;導致主庫傳送binlog&#xff0c;瞬間占滿網絡&#xff0c;觸發故障。 為了做一些限制&#xff0c; 給mysql在發送binlog的函數(mysql_binlog_send)里每隔一段時間sleep一次&#xff0c; 增加了兩個參數&#xff1a; master_s…