#
面試必看(C/C++程序員應聘常見面試題深入剖析(2))
3.內功題
試題1:分別給出BOOL,int,float,指針變量 與“零值”比較的 if 語句(假設變量名為var)
解答:
BOOL型變量:if(!var)
int型變量:? ?if(var==0)
float型變量:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
指針變量: if(var==NULL)
剖析:
考查對0值判斷的“內功”,BOOL型變量的0判斷完全可以寫成if(var==0),而int型變量也可以寫成if(!var),指針變量的判斷也可以寫成if(!var),上述寫法雖然程序都能正確運行,但是未能清晰地表達程序的意思。
一般的,如果想讓if判斷一個變量的“真”、“假”,應直接使用if(var)、if(!var),表明其為“邏輯”判斷;如果用if判斷一個數值型變量(short、int、long等),應該用if(var==0),表明是與0進行“數值”上的比較;而判斷指針則適宜用if(var==NULL),這是一種很好的編程習慣。
浮點型變量并不精確,所以不可將float變量用“==”或“!=”與數字比較,應該設法轉化成“>=”或“<=”形式。如果寫成if (x == 0.0),則判為錯,得0分。
試題2:以下為Windows NT下的32位C++程序,請計算sizeof的值
void Func ( char str[100] )
{
? ???sizeof( str ) = ?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
解答:
sizeof( str ) = 4
sizeof ( p ) = 4
剖析:
Func ( char str[100] )函數中數組名作為函數形參時,在函數體內,數組名失去了本身的內涵,僅僅只是一個指針;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。
數組名的本質如下:
(1)數組名指代一種數據結構,這種數據結構就是數組;
例如:
char str[10];
cout << sizeof(str) << endl;
? ?輸出結果為10,str指代數據結構char[10]。
(2)數組名可以轉換為指向其指代實體的指針,而且是一個指針常量,不能作自增、自減等操作,不能被修改;
char str[10];
str++;? ?//編譯出錯,提示str不是左值
(3)數組名作為函數形參時,淪為普通指針。
Windows NT 32位平臺下,指針的長度(占用內存的大小)為4字節,故sizeof( str ) 、
sizeof ( p ) 都為4。
試題3:寫一個“標準”宏MIN,這個宏輸入兩個參數并返回較小的一個。另外,當你寫下面的代碼時會發生什么事?
least = MIN(*p++, b);
解答:
#define MIN(A,B)? ? ((A) <=??(B) ? (A) : (B))
MIN(*p++, b)會產生宏的副作用
剖析:
這個面試題主要考查面試者對宏定義的使用,宏定義可以實現類似于函數的功能,但是它終歸不是函數,而宏定義中括弧中的“參數”也不是真的參數,在宏展開的時候對“參數”進行的是一對一的替換。
程序員對宏定義的使用要非常小心,特別要注意兩個問題:
(1)謹慎地將宏定義中的“參數”和整個宏用用括弧括起來。所以,嚴格地講,下述解答:
#define MIN(A,B)? ? (A) <=??(B) ? (A) : (B)
#define MIN(A,B)? ? (A <=??B ? A : B )
都應判0分;
(2)防止宏的副作用。
宏定義#define MIN(A,B)? ?((A) <=??(B) ? (A) : (B))對MIN(*p++, b)的作用結果是:
((*p++) <=??(b) ? (*p++) : (*p++))
這個表達式會產生副作用,指針p會作三次++自增操作。
除此之外,另一個應該判0分的解答是:
#define MIN(A,B)? ? ((A) <=??(B) ? (A) : (B));??
這個解答在宏定義的后面加“;”,顯示編寫者對宏的概念模糊不清,只能被無情地判0分并被面試官淘汰。
試題4:為什么標準頭文件都有類似以下的結構?
? ?#ifndef __INCvxWorksh
? ?#define __INCvxWorksh
? ?#ifdef __cplusplus
? ?extern "C" {
? ?#endif
? ?/*...*/
? ?#ifdef __cplusplus
? ?}
? ?#endif
? ?#endif /* __INCvxWorksh */
? ?解答:
頭文件中的編譯宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif
的作用是防止被重復引用。
作為一種面向對象的語言,C++支持函數重載,而過程式語言C則不支持。函數被C++編譯后在symbol庫中的名字與C語言的不同。例如,假設某個函數的原型為:
void foo(int x, int y);
該函數被C編譯器編譯后在symbol庫中的名字為_foo,而C++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函數名和函數參數數量及類型信息,C++就是考這種機制來實現函數重載的。
為了實現C和C++的混合編程,C++提供了C連接交換指定符號extern "C"來解決名字匹配問題,函數聲明前加上extern "C"后,則編譯器就會按照C語言的方式將該函數編譯為_foo,這樣C語言中就可以調用C++的函數了。
試題5:編寫一個函數,作用是把一個char組成的字符串循環右移n個。比如原來是“abcdefghi”如果n=2,移位后應該是“hiabcdefgh”
函數頭是這樣的:
//pStr是指向以'\0'結尾的字符串的指針
//steps是要求移動的n
void LoopMove ( char * pStr, int steps )
{
//請填充...
}
解答:
正確解答1:
void LoopMove ( char *pStr, int steps )
{
? ? int n = strlen( pStr ) - steps;
? ? char tmp[MAX_LEN];? ?
? ? strcpy ( tmp, pStr + n );
? ? strcpy ( tmp + steps, pStr);? ?
? ? *( tmp + strlen ( pStr ) ) = '\0';
? ? strcpy( pStr, tmp );
}
正確解答2:
void LoopMove ( char *pStr, int steps )
{
? ? int n = strlen( pStr ) - steps;
? ? char tmp[MAX_LEN];? ?
? ? memcpy( tmp, pStr + n, steps );? ?
? ? memcpy(pStr + steps, pStr, n );? ?
? ? memcpy(pStr, tmp, steps );? ?
}
剖析:
這個試題主要考查面試者對標準庫函數的熟練程度,在需要的時候引用庫函數可以很大程度上簡化程序編寫的工作量。
最頻繁被使用的庫函數包括:
(1)? ?? ? strcpy
(2)? ?? ? memcpy
(3)? ?? ? memset
試題7:編寫類String的構造函數、析構函數和賦值函數,已知類String的原型為:
class String
{? ?? ?
public:? ?? ?
??String(const char *str = NULL); // 普通構造函數? ???
??String(const String &other); // 拷貝構造函數? ?
??~ String(void); // 析構函數??
??String & operate =(const String &other); // 賦值函數? ?? ?
private:? ?? ?
??char *m_data; // 用于保存字符串? ?? ?
};
解答:
//普通構造函數
String::String(const char *str)
{
? ?? ? if(str==NULL)
? ?? ? {
? ?? ?? ?? ?? ?m_data = new char[1]; // 得分點:對空字符串自動申請存放結束標志'\0'的空
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? //加分點:對m_data加NULL 判斷
? ?? ?? ?? ?? ?*m_data = '\0';
? ?? ? }? ???
? ?? ? else
? ?? ? {
? ?? ???int length = strlen(str);
? ?? ???m_data = new char[length+1]; // 若能加 NULL 判斷則更好
? ?? ???strcpy(m_data, str);
? ?? ? }
}
// String的析構函數
String::~String(void)
{
? ?? ? delete [] m_data; // 或delete m_data;
}
//拷貝構造函數
String::String(const String &other) // 得分點:輸入參數為const型
{? ?? ?
? ?? ? int length = strlen(other.m_data);
? ?? ? m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
? ?? ? strcpy(m_data, other.m_data);? ???
}
//賦值函數
String & String::operate =(const String &other) // 得分點:輸入參數為const型
{? ?? ?
? ?? ? if(this == &other)? ?? ?? ?? ?? ??? //得分點:檢查自賦值
? ?? ?? ?? ?? ?return *this;? ?
? ?? ? delete [] m_data;? ?? ?? ??? //得分點:釋放原有的內存資源
? ?? ? int length = strlen( other.m_data );? ?? ?
? ?? ? m_data = new char[length+1]; //加分點:對m_data加NULL 判斷
? ?? ? strcpy( m_data, other.m_data );? ?
? ?? ? return *this;? ? //得分點:返回本對象的引用
}
剖析:
能夠準確無誤地編寫出String類的構造函數、拷貝構造函數、賦值函數和析構函數的面試者至少已經具備了C++基本功的60%以上!
在這個類中包括了指針類成員變量m_data,當類中包括指針類成員變量時,一定要重載其拷貝構造函數、賦值函數和析構函數,這既是對C++程序員的基本要求,也是《Effective C++》中特別強調的條款。
仔細學習這個類,特別注意加注釋的得分點和加分點的意義,這樣就具備了60%以上的C++基本功!
試題8:請說出static和const關鍵字盡可能多的作用
解答:
static關鍵字至少有下列n個作用:
(1)函數體內static變量的作用范圍為該函數體,不同于auto變量,該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值;
(2)在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問;
(3)在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用范圍被限制在聲明它的模塊內;
(4)在類中的static成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝;
(5)在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員變量。
const關鍵字至少有下列n個作用:
(1)欲阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;
(3)在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;
(4)對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量;
(5)對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回結果必須是一個const對象。如果不是,這樣的變態代碼也不會編譯出錯:
classA a, b, c;
(a * b) = c; // 對a*b的結果賦值
操作(a * b) = c顯然不符合編程者的初衷,也沒有任何意義。
剖析:
驚訝嗎?小小的static和const居然有這么多功能,我們能回答幾個?如果只能回答1~2個,那還真得閉關再好好修煉修煉。
這個題可以考查面試者對程序設計知識的掌握程度是初級、中級還是比較深入,沒有一定的知識廣度和深度,不可能對這個問題給出全面的解答。大多數人只能回答出static和const關鍵字的部分功能。
試題:寫一個函數返回1+2+3+…+n的值(假定結果不會超過長整型變量的范圍)
解答:
int Sum( int n )
{
? ?? ? return??( (long)1 + n) * n / 2; //或return??(1l + n) * n / 2;
}
剖析:
對于這個題,只能說,也許最簡單的答案就是最好的答案。下面的解答,或者基于下面的解答思路去優化,不管怎么“折騰”,其效率也不可能與直接return ( 1 l + n ) * n / 2相比!
int Sum( int n )
{
??long sum = 0;
??for( int i=1; i<=n; i++ )
??{
? ?? ?? ?sum += i;
??}
??return sum;
}
所以程序員們需要敏感地將數學等知識用在程序設計中。
面試必看(C/C++程序員應聘常見面試題深入剖析(1))
1.引言
本文的寫作目的并不在于提供C/C++程序員求職面試指導,而旨在從技術上分析面試題的內涵。文中的大多數面試題來自各大論壇,部分試題解答也參考了網友的意見。
許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業要求面試者寫一個最簡單的strcpy函數都可看出面試者在技術上究竟達到了怎樣的程度,我們能真正寫好一個strcpy函數嗎?我們都覺得自己能,可是我們寫出的strcpy很可能只能拿到10分中的2分。讀者可從本文看到strcpy函數從2分到10分解答的例子,看看自己屬于什么樣的層次。此外,還有一些面試題考查面試者敏捷的思維能力。
分析這些面試題,本身包含很強的趣味性;而作為一名研發人員,通過對這些面試題的深入剖析則可進一步增強自身的內功。
2.找錯題
試題1:
void test1()
{
? ?char string[10];
? ?char* str1 = "0123456789";
? ???strcpy( string, str1 );
}
試題2:
void test2()
{
? ?char string[10], str1[10];
? ???int i;
? ???for(i=0; i<10; i++)
? ???{
? ?? ???str1[i] = 'a';
? ???}
? ???strcpy( string, str1 );
}
試題3:
void test3(char* str1)
{
? ?char string[10];
? ?if( strlen( str1 ) <= 10 )
? ???{
? ?? ?? ?? ?strcpy( string, str1 );
? ???}
}
解答:
試題1字符串str1需要11個字節才能存放下(包括末尾的’\0’),而string只有10個字節的空間,strcpy會導致數組越界;
對試題2,如果面試者指出字符數組str1不能在數組內結束可以給3分;如果面試者指出strcpy(string, str1)調用使得從str1內存起復制到string內存起所復制的字節數具有不確定性可以給7分,在此基礎上指出庫函數strcpy工作方式的給10分;
對試題3,if(strlen(str1) <= 10)應改為if(strlen(str1) < 10),因為strlen的結果未統計’\0’所占用的1個字節。
剖析:
考查對基本功的掌握:
(1)字符串以’\0’結尾;
(2)對數組越界把握的敏感度;
(3)庫函數strcpy的工作方式,如果編寫一個標準strcpy函數的總分值為10,下面給出幾個不同得分的答案:
2分
void strcpy( char *strDest, char *strSrc )
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}
4分
void strcpy( char *strDest, const char *strSrc )
//將源字符串加const,表明其為輸入參數,加2分
{
while( (*strDest++ = * strSrc++) != ‘\0’ );
}
7分
void strcpy(char *strDest, const char *strSrc)??
{
//對源地址和目的地址加非0斷言,加3分
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = * strSrc++)??!=??‘\0’ );
}
10分
//為了實現鏈式操作,將目的地址返回,加3分!
char * strcpy( char *strDest, const char *strSrc )??
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;??
while( (*strDest++ = * strSrc++) != ‘\0’ );
??return address;
}
從2分到10分的幾個答案我們可以清楚的看到,小小的strcpy竟然暗藏著這么多玄機,真不是蓋的!需要多么扎實的基本功才能寫一個完美的strcpy啊!
(4)對strlen的掌握,它沒有包括字符串末尾的'\0'。
讀者看了不同分值的strcpy版本,應該也可以寫出一個10分的strlen函數了,完美的版本為:
int strlen( const char *str )? ? //輸入參數const
{
? ???assert( strt != NULL );? ? //斷言字符串地址非0
? ???int len;
? ???while( (*str++) != '\0' )
? ???{??
? ?? ?? ?? ?len++;
? ???}
? ???return len;
}
試題4:
void GetMemory( char *p )
{
? ?p = (char *) malloc( 100 );
}
void Test( void )
{
? ?char *str = NULL;
? ?GetMemory( str );
? ?strcpy( str, "hello world" );
? ?printf( str );
}
試題5:
char *GetMemory( void )
{? ?
? ???char p[] = "hello world";? ?? ?
? ???return p;??
}
void Test( void )
{? ?
? ???char *str = NULL;??
? ???str = GetMemory();? ?
? ???printf( str );? ?
}
試題6:
void GetMemory( char **p, int num )
{
? ???*p = (char *) malloc( num );
}
void Test( void )
{
? ???char *str = NULL;
? ???GetMemory( &str, 100 );
? ???strcpy( str, "hello" );
? ???printf( str );
}
試題7:
void Test( void )
{
? ???char *str = (char *) malloc( 100 );
? ???strcpy( str, "hello" );
? ???free( str );
? ???...??//省略的其它語句
}
解答:
試題4傳入中GetMemory( char *p )函數的形參為字符串指針,在函數內部修改形參并不能真正的改變傳入形參的值,執行完
char *str = NULL;
GetMemory( str );
后的str仍然為NULL;
試題5中
? ???char p[] = "hello world";? ?
? ???return p;??
的p[]數組為函數內的局部自動變量,在函數返回后,內存已經被釋放。這是許多程序員常犯的錯誤,其根源在于不理解變量的生存期。
試題6的GetMemory避免了試題4的問題,傳入GetMemory的參數為字符串指針的指針,但是在GetMemory中執行申請內存及賦值語句
p = (char *) malloc( num );
后未判斷內存是否申請成功,應加上:
if ( p == NULL )
{
? ?...//進行申請內存失敗處理
}
試題7存在與試題6同樣的問題,在執行
char *str = (char *) malloc(100);
后未進行內存是否申請成功的判斷;另外,在free(str)后未置str為空,導致可能變成一個“野”指針,應加上:
str = NULL;
試題6的Test函數中也未對malloc的內存進行釋放。
剖析:
試題4~7考查面試者對內存操作的理解程度,基本功扎實的面試者一般都能正確的回答其中50~60的錯誤。但是要完全解答正確,卻也絕非易事。
對內存操作的考查主要集中在:
(1)指針的理解;
(2)變量的生存期及作用范圍;
(3)良好的動態內存申請和釋放習慣。
在看看下面的一段程序有什么錯誤:
swap( int* p1,int* p2 )
{
? ???int *p;
? ???*p = *p1;
? ???*p1 = *p2;
? ???*p2 = *p;
}
在swap函數中,p是一個“野”指針,有可能指向系統區,導致程序運行的崩潰。在VC++中DEBUG運行時提示錯誤“Access Violation”。該程序應該改為:
swap( int* p1,int* p2 )
{
? ???int p;
? ???p = *p1;
? ???*p1 = *p2;
? ???*p2 = p;
}
C++中const類型(二)----常指針和常引用
2.常指針和常引用
(1)常指針
? ?? ?使用const指針時,由于const的位置不同,而含意不同。下面舉兩個例子,說明它們的區別。下面定義的一個指向字符串的常量指針:
char *const ptr1 = stirngprt1;
其中,ptrl是一個常量指針。因此,下面賦值是非法的。
ptr1 = stringprt2;
而下面的賦值是合法的:
*ptr1 = “ m ”;
因為指針ptr1所指向的變量是可以更新的,不可更新的是常量指針ptr1所指的方向(別的字符串)。下面定義了一個指向字符串常量的指針:
const *ptr2 = stringprt;
其中,ptr2是一個指向字符串常量的指針。Ptr2所指向的字符串不能更新,而ptr2是可以更新的。因此:
*ptr1 = “ x ”;
是非法的,而:
ptr2 = stringptr2;
是合法的。
? ? 所以,在使用const修飾指針時,應該注意const的位置。定義一個指向字符串的指針常量和定義一個指向字符串常量的指針時,const修飾符的位置不同,前者const放在*和指針名之間,后者const放在類型說明符前。
(2)常引用
? ?? ?使用const修飾符也可以說明引用,被說明的引用為常引用,該引用所引用的對象不能被更新。其定義格式如下:
const<類型說明符>&<引用名>
例如:
const double &v;
在實際應用中,常指針和常引用往往用來作函數的形參,這樣的參數稱為常參數。
? ?? ?在C++面向對象的程序設計中,指針和引用使用得較多,其中使用const修飾的常指針和常引用用得更多。使用常參數則表明該函數不會更新某個參數所指向或所引用的對象,這樣在參數傳遞過程中就不需要拷貝化構造函數,這將會提高程序的運行效率。
下面舉一例子說明常指針作函數參數的用法:
#include <iostream.h>
const int N = 6;
void print(const int *p, int n);
void main()
{
? ? ? ? int array[N];
? ? for(int i = 0; i < N; i++)
? ? ? ? {
? ? ? ? ? ? ? ? cin >> array[i];
? ? ? ? }
? ? ? ? print(array, N);
}
void print(const int *p, int n)
{
? ? ? ? cout << "{" << *p;
? ? ? ?
? ? for(int i = 1; i < N; i++)
? ? ? ? {
? ? ? ? ? ? ? ? cout <<"," << *(p+i);
? ? ? ? }
}
堆和棧的區別
[b][color=Red]堆:[/color][/b] 是大家共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是用戶分配的空間。堆在操作系統對進程 初始化的時候分配,運行過程中也可以向系統要額外的堆,但是記得用完了要還給操作系統,要不然就是內存泄漏。
[b][color=Red]棧:[/color][/b] 是個線程獨有的,保存其運行狀態和局部自動變量的。棧在線程開始的時候初始化,每個線程的棧互相獨立,因此 ,棧是 thread safe的。每個C ++對象的數據成員也存在在棧中,每個函數都有自己的棧,棧被用來在函數 之間傳遞參數。操作系統在切換線程的時候會自動的切換棧,就是切換 SS/ESP寄存器。棧空間不需要在高級語言里面顯式的分配 和釋放。
[b][color=Black]堆和棧的區別[/color][/b]
[b]一、預備知識—程序的內存分配[/b]
一個由c/C++編譯的程序占用的內存分為以下幾個部分:
1、棧區(stack)—? ?由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) —? ?一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束后由系統釋放。
4、文字常量區??—常量字符串就是放在這里的。 程序結束后由系統釋放。
5、程序代碼區—存放函數體的二進制代碼。
二、例子程序
[code]
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
}
[/code]
[b]二、堆和棧的理論知識[/b]
2.1申請方式
stack:
由系統自動分配。 例如,聲明在函數中一個局部變量 int b; 系統自動在棧中為b開辟空間
heap:
需要程序員自己申請,并指明大小,在c中malloc函數
如p1 = (char *)malloc(10);
在C++中用new運算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在棧中的。
2.2
申請后系統的響應
棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時, 會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。
2.3申請大小的限制
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也可能是1M,它是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小
。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
2.4申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
2.5堆和棧中的存儲內容
棧: 在函數調用時,第一個進棧的是主函數中后的下一條指令(函數調用語句的下一條可執行語句)的地址,然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然后是函數中的局部變量。注意靜態變量是不入棧的。
當本次函數調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。
2.6存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在運行時刻賦值的;
而bbbbbbbbbbb是在編譯時就確定的;
但是,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
比如:
[code]
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
[/code]
對應的匯編代碼
[code]
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
[/code]
第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到edx中,在根據
edx讀取字符,顯然慢了。
2.7小結:
堆和棧的區別可以用如下的比喻來看出:
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。
查看完整版本:
http://bbs.very91.com:8000/viewthread.php?tid=272
1. 找錯
void test1()
{
??? char string[10];
??? char* str1="0123456789";
??? strcpy(string, str1);
}
答:表面上并且編譯都不會錯誤。但如果string數組原意表示的是字符串的話,那這個賦值就沒有達到意圖。最好定義為char string[11],這樣最后一個元素可以存儲字符串結尾符'\0';
void test2()
{
??? char string[10], str1[10];
? for(int I=0; I<10;I++)
? {
??? str1[I] ='a';
? }
? strcpy(string, str1);
}
答:strcpy使用錯誤,strcpy只有遇到字符串末尾的'\0'才會結束,而str1并沒有結尾標志,導致strcpy函數越界訪問,不妨讓str1[9]='\0',這樣就正常了。
void test3(char* str1)
{
??? char string[10];
??? if(strlen(str1)<=10)
{
??? strcpy(string, str1);
}
}
答:這又會出現第一道改錯題的錯誤了。strlen(str1)算出來的值是不包含結尾符'\0'的,如果str1剛好為10個字符+1結尾符,string就得不到結尾符了。可將strlen(str1)<=10改為strlen(str1)<10。
2. 找錯
#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;
}
答:我不知道這段代碼的具體功能,但明顯有兩個錯誤
1,SRM_no沒有賦初值
2,由于static的聲明,使該函數成為不可重入(即不可預測結果)函數,因為SRM_no變量放在程序的全局存儲區中,每次調用的時候還可以保持原來的賦值。這里應該去掉static聲明。
3. 寫出程序運行結果
int sum(int a)
{
??? auto int c=0;
??? static int b=3;
? c+=1;
? b+=2;
? return(a+b+c);
}
?void main()
{
??? int I;
? int a=2;
? for(I=0;I<5;I++)
? {
??? printf("%d,", sum(a));
? }
}
答:8,10,12,14,16
該題比較簡單。只要注意b聲明為static靜態全局變量,其值在下次調用時是可以保持住原來的賦值的就可以。
----------------------------------------------
插播廣告啦:版權所有:朱科 歡迎光臨我的網站:www.goodsoft.cn,各位轉貼別刪,勞動成果啊
----------------------------------------------
4.
int func(int a)
{
??? int b;
??? switch(a)
??? {
??????? case 1: b=30;
??????? case 2: b=20;
??????? case 3: b=16;
??????? default: b=0;
?? }
?? return b;
}
則func(1)=?
答:func(1)=0,因為沒有break語句,switch中會一直計算到b=0。這是提醒我們不要忘了break。呵呵。
5:
? int a[3];
? a[0]=0; a[1]=1; a[2]=2;
? int *p, *q;
? p=a;
? q=&a[2];
則a[q-p]=?
答:a[q-p]=a[2]=2;這題是要告訴我們指針的運算特點
6.
定義 int **a[3][4], 則變量占有的內存空間為:_____
答:此處定義的是指向指針的指針數組,對于32位系統,指針占內存空間4字節,因此總空間為3×4×4=48。
7.
編寫一個函數,要求輸入年月日時分秒,輸出該年月日時分秒的下一秒。如輸入2004年12月31日23時59分59秒,則輸出2005年1月1日0時0分0秒。
答:
/*輸入年月日時分秒,輸出年月日時分秒的下一秒,輸出仍然在原內存空間*/
void NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond)
{
? int nDays;
? (*nSecond)++;? // 秒加1
? if(*nSecond>=60)? // 秒滿60,做出特殊處理,下面時,日,月等類同
? {
??? *nSecond=0;
??? (*nMinute)++;
??? if(*nMinute>=60)
??? {
????? *nMinute=0;
????? (*nHour)++;
????? if(*nHour>=24)
????? {
??????? *nHour=0;
??????? (*nDate)++;
??????? switch(*nMonth)
??????? {
????????? case 1:
????????? case 3:
????????? case 5:
????????? case 7:
????????? case 8:
????????? case 10:
????????? case 12:
??????????? nDays=31;
????????? break;
????????? case 2:// 判斷閏年
??????????? if(*nYear%400==0||*nYear%100!=0&&*nYear%4==0)
??????????? {
??????????? nDays=29;
??????????? }
??????????? else
??????????? {
??????????? nDays=28;
??????????? }
????????? break;
????????? default:
??????????? nDays=30;
????????? break;
??????? }
??????? if(*nDate>nDays)
??????? {
????????? *nDate=1;
????????? (*nMonth)++;
????????? if(*nMonth>12)
????????? {
????????? *nMonth=1;
????????? (*nYear)++;
????????? }
??????? }
????? }
??? }
? }
}
/*示例可運行代碼*/
void main()
{
? int nYear=2004,nMonth=12,nDate=31,nHour=59,nMinute=59,nSecond=59;
? NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond);
? printf("The result:%d-%d-%d %d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond);
}
intel比試題&面試題:
(熟悉大公司的題目,并不僅僅是為了進這些公司,而是很多國內公司考察內容都很接近而已.)
2005筆試 :
1。高效的內存管理
2。8皇后問題
面試q:
(2) 編譯中的問題:全局變量如int i=5; int*(pf)()=foo; 分別在何時被初始化?設計時候如何具體的實現。
(3) OS相關的問題,內存訪問,cache等(包括cache在整個系統中的位置,畫出來,并解釋)
(4) 解釋例如mov ax,100H 這樣一條指令的cpu, os, memory等都完成了什么樣的工作。
(5) Strlen()的C語言實現,不能使用任何變量。
(6) 編譯中display表的一些問題
(7) 一個hash函數,輸入隨機,現發生沖突,如數據集中在某幾條中,問怎樣處理hash函數保證高效的訪問,怎樣實現?
(8) 把Switch()case…語句翻譯成三元組。
(9) 一個byte(用C語言實現計數其中1的個數),給出最高效的實現方法。(位域)或者查表最快的;
(10) 上海有多少個加油站?你是怎樣解決這一問題?
(11) C語言參數的入棧順序?為什么這么實現?
(12) 你的最大的優點和缺點分別是什么?
(13) C語言中字符串的翻轉,最高效率(時間和空間)的實現?
2004
1. 三個float:a,b,c 問值
(a+b)+c==(b+a)+c
(a+b)+c==(a+c)+b
2. 把一個鏈表反向填空
3. 設計一個重采樣系統,說明如何anti-alias
4. y1(n)=x(2n), y2(n)=x(n/2),問:
如果y1為周期函數,那么x是否為周期函數
如果x為周期函數,那么y1是否為周期函數
如果y2為周期函數,那么x是否為周期函數
如果x為周期函數,那么y2是否為周期函數
5. 如果模擬信號的帶寬為5KHZ,要用8K的采樣率,怎么辦。
4. 某個程序在一個嵌入式系統(200M的CPU,50M的SDRAM)中已經最化了,換到另一個系統
(300M的CPU,50M的SDRAM)中運行,還需要優化嗎?
5. x^4+a*x^3+x^2+c*x+d最少需要作幾次乘法
6. 什么情況下,sin(x+y)+y ~ ....
7. 下面哪種排序法對12354最快
a quick sort
b.buble sort
c.merge sort
8. 哪種結構,平均來講,獲取一個值最快
a. binary tree
b. hash table
c. stack
1。 pipeline
2。 程序流程圖題目
3。 哲學家進餐
4。 32bit,64bit,兩個平臺上complier,linker,os kernel,library,debuger的性質
5。 const char * vs char const * (?)
6。 GDT and LDT
7。 1+1<<1
8。 Stack性質
9。 ???
10。正方體中壓力什么的。。。
大題
1。f[40,400],log10變換
2。ACPI
3。讀程序
4。頻譜,采樣分析
大題
1。寫出下列信號的奈虧斯特頻率
(1)f(t)=1+cos(2000pait)+sin(4000pait)
(2)f(t)=sin(4000pait)/pait
(3)f(t)=(sin(4000pait)的平方)/pait
2.填程序
把一個計算m^n的程序填充完整
大概的意思是:
有一個全局數組char s[BUFSIZE]
利用這個數組計算,就是每個單元存放計算結果的一位,index小的存放低位,index大
的存放高位
3。有兩個線程
void producer()
{
while(1)
{
GeneratePacket();
PutPacketIntoBuffer();
Signal(customer);
}
}
void customer()
{
while(1)
{
WaitForSignal();
if(PacketInBuffer>10)
{
ReadAllPackets();
ProcessPackets();
}
}
}
(1)有沒有其他方法可以提高程序的性能
(2)可不可以不使用信號之類的機制來實現上述的功能
4。優化下面的程序
(0)sum=0
(1)I=1
(2)T1=4*I
(3)T2=address(A)-4
(4)T3=T2[T1]
(5)T4=address(B)-4
(6)T5=4*I
(7)T6=T4[T5]
(8)T7=T3*T5
(9)sum=sum+T6
(10)I=I+1
(10)IF I<20 GOTO (2)
1。關于c的main函數
2。15個人循環報數,報到N的出列,找出最后留下的那個人,算法填空題
2。找出一個給出的并行解決方案的錯誤情況
3。關于GPIO,intel的四種體系結構
選擇題10題
有關vc和c,指針,HyporThreading Dual-core等等
看也看不懂的
2003年的
1:概率題。x,y為隨機變量,聯合概率密度 f(x,y) = intig(0,1)*dx*intig(0,x)*k*d
y,k為常數,求k=? E(xy)=?
注:intig(a,b)為a到b的定積分。
2:概率題。A,B為隨機事件,以下哪個正確
A. P(A U B)*p(AB) <= P(A)P(B)
B. P(A U B)*p(AB) >= P(A)P(B)
C. P(A U B)*p(AB) <= P(A) + P(B)
D. P(A U B)*p(AB) >= P(A) + P(B)
3: 信道帶寬200kHz,信噪比10dB,求信道波特率=?
4:以下代碼運行結果是什么
int main()
{
int a,b,c,abc = 0;
a=b=c=40;
if(c)
{
int abc;
abc = a*b+c;
}
printf("%d,%d", abc, c);
return 0;
}
5:給出了從紐約出發和到達落山雞的各種航班信息,寫出找到一條從紐約到落山雞的最
短距離的航班組合的代碼。
6:從計算機圖形上截取某個物體邊緣的若干個坐標,求這個物體面積,并跟判斷是方形
還是圓形,為啥。(坐標不記得,大概是個圓
)。
7:離散卷機與DFT的區別與關系。快速求不滿足2^N長度的離散傅立葉變換的方法有哪些
?如何用fft求N*M點的離散卷機?
8:給出fir和iir的優缺點。
9:如何計算線性標量量化器的量化噪聲?需要那些假設?
普天C++筆試題
1.實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,寫出這兩個函數。
2.寫一個函數,將其中的 都轉換成4個空格。
3.Windows程序的入口是哪里?寫出Windows消息機制的流程。
4.如何定義和實現一個類的成員函數為回調函數?
5.C++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
6.C++里面如何聲明const void f(void)函數為C程序中的庫函數?
7.下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
8.內聯函數在編譯時是否做參數類型檢查?
void g(base & b){
b.play;
}
void main(){
son s;
發信人: wildboy
標 題:
上午潤匯的筆試題發信站: BBS 水木清華站 (Sat Nov 30 13:18:53 2002), 站內
c++最后幾個大題目是
1,實現雙向鏈表刪除一個節點P,在節點P后插入一個節點,這兩個函數。
2,寫一個函數將其中的\t都轉換成4個空格。
3,windows程序的入口是哪里?寫出windows消息機制的流程。
4,如何定義和實現一個類的成員函數為回調函數。
還有前面的幾個:
1. class A{
int a;
int b;
}
問的是編譯時的default constructor function的問題。
還有一個說,A有其他自己定義的構造函數,問是否還有default constructor function
還是什么來著,記不清樂。
2. c++里面是不是所有的動作都是main()引起的?如果不是,請舉例。
3. c++里面如何聲明const void f(void)函數為C庫函數?(這個我前幾天還看來著,
居然就忘記樂, )
對了,還考樂一些關于const的問題
問下列哪兩個是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
還有一個是考類的成員函數是 void f() const;型的時候調用的問題。
幸好昨天剛剛看樂這部分的內容,呵呵
內聯函數考了一題,問內聯函數在編譯時是否做參數類型檢查。
虛函數也考了一題,不過不難。
class base{
public:
virtual void play(){
cout<<"base";
}
}
class son: public base{
public:
void play(){cout<<"son";}
}
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}
第一部分 公司篇】
1、華為公司的全稱為()
A、深圳市華為技術有限公司 B、華為技術有限公司
C、華為公司 D、我司
(答案:B,答A、C者酌情給分,答D者立即辭退,我司三令五申禁止使用該華
為內
部
土語,屢禁不止,老員工不可教也,只好從新員工抓起,格殺勿論)
2、華為公司的企業性質是()
A、民營 B、私營 C、國營 D、上市公司
(答案:A,本題主要讓考生了解公司的性質)
3、華為公司的商標象征()
A、紅太陽 B、菊花 C、扇貝
(答案:B,答A者酌情給分,答C者立即辭退,天天就想著吃)
4、從下列選項中選擇出公司的常務副總裁()
A、任正非 B、孫亞芳 C、李一男 D、鄭寶用 E、張燕燕
(答案:BD,答C者立即辭退,讓他到李一男的公司去報到吧)
5、華為公司的年終獎一般是在每年的什么時候發()
A、元旦后 B、春節前 C、7月下旬或8月上旬 D、勞動節前 E、國慶節前
(答案:C,切記,因為是年中獎,而不是年終獎)
6、華為公司的配給你的股票是()
A、**發的 B、用自己的獎金去買
(答案:B)
7、老板常說的土八路,是指()
A、老板自己的革命年代的光輝歷史
B、本地化的用服兄弟
C、季度考核為D的兄弟
(答案:B)
【第二部分 部門篇】
1、你所在的一級部門為()
A、技術支援部
B、國際技術支援部
C、國際技術支援部國內分部
D、用服
(答案:B,答A、C者酌情給分,答D者作不合格處理,為了提高技術支援部形
象,
公司
早就取消用服這個字眼,而且于2001年春節后悄悄地將技術支援部前加“國際
”二
字)
2、你所在的二級部門為()
A、傳輸產品技術支援管理部
B、傳輸工程部
C、傳輸用服工程中心
D、光網絡產品技術支援管理部
(答案:A,首先得把自己的部門搞清楚,答D者,有遠見,有潛力,可以酌情
給分
,很可能
在2001年未就改成這個名字,因為市場中研已經改了,就差技術支援部了)
3、傳輸的商標為()
A、SBS
B、SDH
C、OptiX
D、Metro
(答案:C,答A者酌情給分,最起碼還知道老商標)
4、技術支援部與國際技術支援部的關系()
A、國際技術支援部是技術支援部下面的一個部門,負責海外
B、技術支援部是國際技術支援部下面的一個部門,負責國內
C、技術支援部是國際技術支援部的前身
D、國際技術支援部是技術支援部的前身
(答案:C)
【第三部分 業務篇】
1、SBS是()
A、傳輸產品的老商標
B、同步骨干系統
C、傻不傻的拼音縮寫
D、帥不帥的拼音縮寫
(答案:AB,答CD者立即辭退)
2、SDH是()
A、傳輸產品商標
B、同步數字序列
C、傻得很的拼音縮寫
D、傻得好的拼音縮寫
(答案:B,答CD者立即辭退)
3、由于你是新員工,沒有公配手機時,當你在現場遇到緊急事故時,你會(
)向公
司求助
A、打用戶機房內的電話
B、借用戶手機
C、拔110
D、拔200或300
E、立即打車回辦事處
(答案:D,答CE者立即辭退,按照公司規定,不能隨便使用用戶的電話,以
提高公
司形象)
4、在開局時,用戶問你在華為干幾年了,你會回答()
A、我是新員工
B、1年多了
C、2年多了
D、3年多了
(答案:B,答A者按不合格處理,按照公司規定,不能說自己是新員工,幾千
萬的
設備,
怎能讓一個新員工用來練兵,用戶知道鼻子不氣歪才怪,答CD者,用戶會哼之
以鼻
,在華為
做了2、3年,還在下面撅個腚開局,鬼才相信你的話呢!)
5、接上題,假如你回答說在華為干1年多了,用戶會說()
A、那你一定是新員工了
B、那你一定是老員工了
(答案:B,用戶對華為很了解,都知道你如果在華為做一年,就已經是老員
工了)
6、接上題及上上題,用戶會繼續問,“那你咋連手機、便攜機,一個都沒有
呢?”
,你會回答()
A、啊,我還沒有轉正咧,等俺轉正時,誤碼儀、手機、便攜機,一個都不能
少
B、啊,沒有關系,正是由于我是老員工,所以開局用不著
C、啊,真倒霉,在來的路上,被土匪打劫了
D、啊,被我的兩個徒弟拿走了,因為他們是新員工,沒有工具膽小,有了工
具好壯
膽
(答案:BCD,答A者,立即辭退,這么點事都搞不定)
7、當你發現用戶的機房中沒有拖鞋時,你會()
A、入鄉隨俗,直接進機房
B、光腳丫
C、馬上出去自己花錢買幾雙拖鞋送給用戶
D、馬上出去買幾雙拖鞋送給用戶,之后開票回來貼票報銷
E、馬上出去買幾雙拖鞋送給用戶,之后開票找局長報銷
(答案:C,答A者,立即辭退,答B者,酌情給分,答D者,不合格處理,答E
者,簡
直是在找
死,立即辭退)
8、技術支援工程師工作的特點()
A、白天睡覺,晚上干活
B、用戶隨叫隨到
C、用戶就是上帝,用戶怎么說,我們就怎么做
D、我是上帝,我想咋干就咋干
(答案:ABC,答D者,立即辭退)
9、在與客戶開會及紙面件交流時,你會使用()來稱呼對方
A、局方 B、用戶 C、客戶 D、貴公司
(答案:BCD,答A者,立即辭退,我司三令五申禁止使用該華為內部土語,屢
禁不
止,
老員工不可教也,只好從新員工抓起,格殺勿論)
10、工程師甲對乙說:“晚上不去泡吧嗎”,乙說:“哦,真不巧,我晚上要
去市
局割接,下次吧”。
請問乙指的“割接”是什么意思()
A、發貨電纜不夠長,從別的地方割一段,然后接上
B、一個工程師替換另一個工程師守局,交接的時候要寫一個報告,然后從中
割開,
一人拿一半。
C、局里晚上有一個慶祝活動,請他剪彩。
D、業務從舊系統上倒到新系統上
(答案:D,答錯者,按不合格處理)
11、工程師A某周日晚正在家里看電視,突然手機響了,電信局運維員工突然
打電話過來,小A接起電話,用戶聲音很急迫,說:“不好了,癱了,你快來
處理”
。
請問這里“癱了”最有可能是什么意思()
A、設備漏電將維護人員電癱了
B、設備支架不夠結實,被壓癱了
C、設備壞了,將維護人員嚇癱了
D、設備壞了,大面積業務中斷了
(答案:D,答錯者,按不合格處理)
12、案例分析:某位局長到傳輸機房視察工作時,被某物砸傷了腦袋瓜,請問
,它
最有可能是()
A、SS02PBS電源盒蓋板
B、SS03PBS電源盒蓋板
C、子架蓋板
D、防雷盒
(答案:A)
---doom2
回復[3]:13、下雨了,打雷了,你會()
A、收衣服
B、擔心網上運行的設備遭到雷公襲擊
C、擔心強盜偷襲機房內的設備
D、擔心食堂開飯會晚點
(答案:B)
14、夜深人靜,輾轉反側的你正在考慮小布什與科爾誰當選總統會對中國更有
利時
,
突然手機響了,最有可能發生的是()
A、主管也睡不覺,想找你喝酒
B、狐朋狗友找你去蹦的
C、用戶找你,因為業務斷了
D、打錯了,是騷擾電話
(答案:D)
15、請你選擇出最常用的排除故障的方法()
A、復位 B、拔插 C、掉電 D、禱告 C、燒香拜神
(答案:ABC)
16、了為有效降低成本,除了()的電話,其它的電話一律不接,然后用固定
電話
回拔過去
A、陌生的號碼
B、很熟悉的用戶
C、不很熟悉的用戶
D、主管與同事
E、狐朋狗友
F、老婆
(答案:C)
17、論文題目:驚心動魄的一夜
本題的目的是考新員工的文筆,為技術案例及技術論文作準備。
寫作要求:
1)、故事情節必須包括:
①業務割接;
②重大事故;
③事故上報;
④局長親自督陣;
⑤業務中斷時間不小于5小時;
⑥未造成特別惡劣的影響;
⑦描述電話內容個數不少于30個;
⑧事件發生有準確的時間點,精確到秒;
⑨復位,拔插,換板;
⑩涉及人物不少于20個。
2)、要體現一個工程師如何排除萬難,在巨大的精神壓力下冷靜沉著,終于解
決問
題,
表現了一個華為工程師優良的單兵作戰能力。
3)、字數不少于3000字,不超過3500字。
18、如果A站和B站之間出現B2誤碼,問題可能在()板
A、A站T16
B、A站R16
C、A站ASP
D、A站X16
E、B站T16
F、B站R16
G、B站ASP
H、B站X16
I、以上答案均不正確
(答案:ABCDEFGH)
19、接上題,上述故障現象最有可發生的地點是()
A、江西九江
B、佳木斯本地網
C、河南信陽
D、沈陽城域
(答案:A)
20、接上上題,如果讓你去維護A站與B站之間的B2問題,你會攜帶哪些必帶物
品(
)
A、便攜機
B、T16、R16、X16、ASP各一塊
C、工具箱
D、私人行李
E、2M誤碼表
F、光功率計
G、老婆
(答案:ABCDEF,有句名言,華為工程師出差,除了老婆,什么都得帶)
21、接上題,對于上述出差必備物品,你會最佳的攜帶方法是()
A、左肩便攜機、右肩工具箱、左手儀表、右手備板、身后行李
B、右肩便攜機、左肩工具箱、右手儀表、左手備板、身后行李
C、讓老子拿這么多東西出差,早知道這樣,老子就不來華為用服了
(答案:AB,重復那句名言,華為工程師出差,除了老婆,什么都得帶)
22、接上題,對于上述情況,你如何打車?()
A、向過路司機擠眉弄眼,眉來眼去,注意,盡量使用媚眼
B、將手中的物品放下,向司機打手勢
C、啥都不用,將一只腳抬起向司機示意即可
D、放開嗓子喊,出租車!
(答案:C,經實踐證明,這招很管用)
23、接18題,如果A與B點相距40KM,在A站已經定位出B站有問題,則從A站下
午
13點鐘開車前去換板,車子時速80KM,需求多長時間才能回到A站?()
A、2小時左右
B、8小時左右
C、12小時左右
D、24小時左右
E、48小時左右
(答案:D,答A者開除。因為現場后,白天不能換板,然后等到午夜12點以后
才可
以換板,
次日繼續留守觀察一上午后,次日下午才能返回)
【第四部分 生活篇】
1、以下手段可以蒙混入關的是()
A、外地身份證 B、良民證 C、邊防證 D、深圳特區暫住證 E、華為工卡
F、婚育證明 G、結婚證 H、乘華為班車
(答案:CDH)
2、如下哪些證件可以應付當地居委會的計劃生育檢查()
A、婚育證明 B、不育證明 C、結婚證 D、邊防證
(答案:A)
3、華為公司員工在業余時間不允許做的事情()
A、打麻將 B、玩撲克 C、出入不健康場所 D、將工卡帶在胸前炫耀 E、按摩
洗頭
(答案:ACD)
4、你可以通過以下途徑出租或求租住房及買賣二手商品()
A、生協Notes B、Notes Mail C、華為電子公告牌
D、一位辭職員工辦的個人主頁〖華為專用物業公告欄〗,地址
http://202.
105.55.
110/hw/
(答案:D)
5、華為工卡可以用來()
A、在深銀聯ATM機上取款
B、在華為小賣部買東西
C、在華為食堂**吃早餐
D、只要蹭到晚9點,就可以到食堂領**的宵夜
(答案:BD)
6、在購買機票時,正常人可以打7折,如果你憑華為工卡,可以打()
A、5折
B、7折
C、8折
D、97折
(答案:D)
7、如下線路中,票價最便宜的是()
A、113
B、204
C、226
D、331
(答案:C)
8、如下線路中,小偷最多的是()
A、113
B、204
C、226
D、331
(答案:BC)
9、如下線路中,不能到新時代廣場的是()
A、113
B、204
C、226
D、331
E、437
F、22
(答案:E)
10、如下線路中,哪一個線路能到新時代廣場但不能坐的是()
A、113
B、204
C、226
D、217
E、437
F、22
(答案:F,因為它繞很遠,上班會遲到)
11、在新時代廣場,如果你既想拿宵夜,又想坐班車,你會()
A、晚8:50去一樓刷卡,再馬上跑到三樓,準排第一,再叫大師傅將宵夜包好
,
卡機時間比快那么幾分鐘,到點刷卡后,馬上順樓梯飛奔到停車場即可,注
意千萬不是坐電梯。
B、蹭到晚9點鐘以后,領完宵夜,再混一會兒,坐晚9點以后的班車
C、算了,本來魚和熊掌就不能兼得,老子不領了,下班就回家
(答案:AB)
12、到辦事處出差,當地安排你住公司的集體宿舍,真倒霉,同屋的哥們雷聲
隆隆
,你會()
A、推醒他,給他一個紅牌警告
B、找辦事處主任理論
C、忍了,到客廳凳子上將就一下
D、不受那份氣,搬家,到賓館開房間
E、武力解決,找本厚書,如華為文摘、走出混飩、培訓手冊等,很很的砸那
位哥們
一下
F、戴上耳機,聽走扁美國
G、頭上蒙上厚被,裝聽不見
H、故意打出更響的呼嚕,嚇一嚇那位哥們
(答案:該無標準答案,只要不選BD,答D者,按不合格處理)
13、出差回來,發現出差前還在宿舍中的自己的拖鞋不翼而飛,你會()
A、死活要將屬于自己的東西找回來,毫不在乎地接著穿
B、死活要將屬于自己的東西找回來,用開水燙燙或用消毒水處理一下,然后
接著穿
C、死活要將屬于自己的東西找回來,然后丟到垃圾桶里
D、不要了,再買一雙新的,以免得腳氣
E、隨便找一雙穿,管它是誰的
F、發誓下次出差前一定要將自己的拖鞋藏起來
(答案:該無標準答案,因為每個人的個性不同)
14、請從如下四個句子中選擇一個正確的描述()
A、人最寶貴的是生命
B、人,最寶貴的是生命
C、生命對于人是最寶貴的
D、對于人,沒有比生命更寶貴的
(答案:D)
回復[5]:15、請問馬路邊的“風炮補胎”是()
A、是汽車修理店的一種招牌,“補胎”是一種維修業務,“風炮”是一位很
有名氣
的修車大師,收了很多徒弟,所以,徒第們往往打著師傅的名氣開店,于是,
街
道就是了N多的風炮補胎執招牌。這與“狗不理包子”類似。
B、是汽車修理店的一種招牌,“風炮”是一種高效的補胎工具。
C、是汽車修理店的一種招牌,“風炮”是一該店的修車師傅的名字,與“王
麻子”
剪刀類似。
D、是自行車修理店的一種招牌,“風炮”是一種快速粘膠,該膠補自行車胎
即快又
好。
(答案:B)
16、請問,距離新時代廣場最近的“風炮補胎”招牌在()
A、從黃貝嶺至蛇口113大巴線的新時代廣場下車點的馬路對面
B、從蛇口至黃貝嶺113大巴線的新時代廣場上車點的馬路邊上
C、別騙人了,新時代廣場附近壓根就沒有
(答案:AB)
17、如下廣告詞正確的是()
A、用一天的電,花兩天的錢
B、用兩天的電,花一天的錢
C、新飛冰箱好,不如新飛廣告做的好
D、新飛廣告做的好,不如新飛冰箱好
(答案:BD)
18、請問,你最討厭如下哪些就餐行為()
A、早餐不刷卡,用10塊錢買
B、早餐買N樣
C、米飯打N下
D、餐紙扯N長
E、夜宵領N樣
F、就餐完畢不做5S,雞蛋皮、筷子皮亂扔在餐桌上
G、走路時不照顧自己的餐盤,將餐液濺灑在他人身上
H、吃飯咂咂響,喝湯吃面條呼嚕呼嚕叫
J、在一個擁擠的電梯里,某人手持一盒瘋牛牛奶,使出吃奶的勁狂吸
K、領9點鐘的夜宵,坐9點鐘的班車
1.設計函數 int atoi(char *s)。
2.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少?
3.解釋局部變量、全局變量和靜態變量的含義。
4.解釋堆和棧的區別。
5.論述含參數的宏與函數的優缺點。