進(jìn)入六月了,四年的大學(xué)生活已接近了尾聲,喜悅、流戀、憂郁,抑或迷茫、惆悵,不管是一個(gè)怎樣的心緒,我用憂郁的眼神審視著周圍的一切,變的冷漠??? 瀟灑的活著,卻絲毫感受不到快樂。浮躁,這個(gè)詞估計(jì)可以很好的來形容現(xiàn)在的我.
牢騷了很多,和c 當(dāng)然沒有半毛錢的關(guān)系,本來快畢業(yè)了,也沒有什么事情可干,只需要享受這僅剩的時(shí)光即可,可我為了換工作,還得去看看這些瑣碎的知識(shí) ,為了筆試。下面多數(shù)是我在網(wǎng)上找的題,通過運(yùn)行調(diào)試,弄明白了,所以放在這里共大家一起學(xué)習(xí),如有錯(cuò)誤還請(qǐng)指正。還有牢騷太多還望包涵。
1. 以下四條輸出語句分別輸出什么?
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout<<ends<<str1<<ends<<str3<<ends<<str5<<endl;
cout << boolalpha << ( str1==str2 ) << endl; //
cout << boolalpha << ( str3==str4 ) << endl; //
cout << boolalpha << ( str5==str6 ) << endl; //
答:輸出結(jié)果是:abc abc abc false false true;str1和str2都是字符數(shù)組,每個(gè)都有其自己的存儲(chǔ)區(qū),它們的值則是各存儲(chǔ)區(qū)首地址,不等;str3和str4同上,只是按const語義,它們所指向的數(shù)據(jù)區(qū)不能修改。str5和str6并非數(shù)組而是字符指針,并不分配存儲(chǔ)區(qū),其后的“abc”以常量形式存于靜態(tài)數(shù)據(jù)區(qū),而它們自己僅是指向該區(qū)首地址的指針,相等。
2. 以下代碼中的兩個(gè)sizeof用法有問題嗎?
void UpperCase( char str[] ) // 將str 中的小寫字母轉(zhuǎn)換成大寫字母
{
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字符長(zhǎng)度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:輸出結(jié)果是:6,ABCDe;函數(shù)內(nèi)的sizeof有問題。sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其字符長(zhǎng)度是6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此在函數(shù)中,只轉(zhuǎn)換了前四個(gè)字符。
3. 以下代碼有什么問題?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
答:變量b定義出錯(cuò)。按默認(rèn)構(gòu)造函數(shù)定義對(duì)象,不需要加括號(hào)。C/C 中的結(jié)構(gòu)和類的區(qū)別很小,只不過一個(gè)是值類型,一個(gè)是引用類型,而且缺省Public、Private等修飾符時(shí),結(jié)構(gòu)默認(rèn)是公共的,類默認(rèn)是私有的。
4.在下面的語句中錯(cuò)誤的是 :
A、int n=5; int y[n]
B、const int n=5; int y[n]
C、in n=5; int *py=new int[n];
D、const int n=5; int *py=new int[n]
答:A, 數(shù)組在聲明的時(shí)候大小必須是固定的,但是在A里面n是一個(gè)變量;即在程序執(zhí)行時(shí)會(huì)去找n的值,因?yàn)閚=5;不是常量,此時(shí)n的值是默認(rèn)的0,因此會(huì)拋出不能分配常量大小為零的數(shù)組的錯(cuò)誤。
5. 以下代碼有什么問題?
cout << (true?1:"0") << endl;
答:三元操作符?:后面的兩個(gè)操作數(shù)必須是同一類型。
6. 以下代碼能夠編譯通過嗎,為什么?
unsigned int const size1 = 2;
char str1[ size1 ];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp;
char str2[ size2 ];
答:str2定義出錯(cuò),size2不是編譯期間常量,而而數(shù)組的定義要求數(shù)組長(zhǎng)度必須為編譯期常量。
7. 以下反向遍歷array數(shù)組的方法有什么錯(cuò)誤?
vector array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 3 );
for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍歷array數(shù)組
{
cout << array[i] << endl;
}
答:首先Vector的聲明應(yīng)指明數(shù)據(jù)類型,如:vector<int> array,vector<int>::size_type ;其次,size_type類型為unsigned int 類型,當(dāng)i=0時(shí),減一變成-1,進(jìn)而轉(zhuǎn)換成很大的數(shù),使數(shù)組不可控。
8. 以下代碼中的輸出語句輸出嗎,為什么?
struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;
答:不能。在默認(rèn)構(gòu)造函數(shù)內(nèi)部再調(diào)用帶參的構(gòu)造函數(shù)屬用戶行為而非編譯器行為,亦即僅執(zhí)行函數(shù)調(diào)用,而不會(huì)執(zhí)行其后的初始化表達(dá)式。只有在生成對(duì)象時(shí),初始化表達(dá)式才會(huì)隨相應(yīng)的構(gòu)造函數(shù)一起調(diào)用。
9. C 中的空類,默認(rèn)產(chǎn)生哪些類成員函數(shù)?
答:
class Empty
{
public:
Empty(); // 缺省構(gòu)造函數(shù)
Empty( const Empty& ); // 拷貝構(gòu)造函數(shù)
~Empty(); // 析構(gòu)函數(shù)
Empty& operator=( const Empty& ); // 賦值運(yùn)算符
Empty* operator&(); // 取址運(yùn)算符
const Empty* operator&() const; // 取址運(yùn)算符const
};
10. 以下兩條輸出語句分別輸出什么?
float a =
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 輸出什么?
float b =
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 輸出什么?
答:分別輸出false和true。注意轉(zhuǎn)換的應(yīng)用。(int)a實(shí)際上是以浮點(diǎn)數(shù)a為參數(shù)構(gòu)造了一個(gè)整型數(shù),該整數(shù)的值是,(int&)a則是告訴編譯器將a當(dāng)作整數(shù)看(并沒有做任何實(shí)質(zhì)上的轉(zhuǎn)換)。因?yàn)橐哉麛?shù)形式存放和以浮點(diǎn)形式存放其內(nèi)存數(shù)據(jù)是不一樣的,因此兩者不等。對(duì)b的兩種轉(zhuǎn)換意義同上,但是的整數(shù)形式和浮點(diǎn)形式其內(nèi)存數(shù)據(jù)是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數(shù)值意義上)。
注意,程序的輸出會(huì)顯示(int&)a=1065353216,這個(gè)值是怎么來的呢?前面已經(jīng)說了,以浮點(diǎn)數(shù)形式存放在內(nèi)存中,按ieee754規(guī)定,其內(nèi)容為x0000803F(已考慮字節(jié)反序)。這也就是a這個(gè)變量所占據(jù)的內(nèi)存單元的值。當(dāng)(int&)a出現(xiàn)時(shí),它相當(dāng)于告訴它的上下文:“把這塊地址當(dāng)做整數(shù)看待!不要管它原來是什么?!边@樣,內(nèi)容x0000803F按整數(shù)解釋,其值正好就是(十進(jìn)制數(shù))。
通過查看匯編代碼可以證實(shí)“(int)a相當(dāng)于重新構(gòu)造了一個(gè)值等于a的整型數(shù)”之說,而(int&)的作用則僅僅是表達(dá)了一個(gè)類型信息,意義在于為cout<<及==選擇正確的重載版本。
11. 以下代碼有什么問題?
typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數(shù)組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); itor )
{
if( 2 == *itor ) array.erase( itor );
}
答:同樣,定義時(shí)沒有指明參數(shù)類型,而且在執(zhí)行array.erase(itor)后,會(huì)自動(dòng)前移,這樣就會(huì)漏掉迭代項(xiàng)。
12. 寫一個(gè)函數(shù),完成內(nèi)存之間的拷貝。[考慮問題是否全面]
void* mymemcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast<char*>( dest );
const char* psrc = static_cast<const char*>( src );
if( pdest>psrc && pdest<psrc cout ) // 能考慮到這種情況就行了
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
{
for( size_t i=0; i<count; i )
pdest[i] = psrc[i];
}
return dest;
}
void main( void )
{
char str[] = "0123456789";
mymemcpy( str 1, str 0, 9 );
cout << str << endl;
mymemcpy( str, str 5, 5 );
cout << str << endl;
system( "Pause" );
}
看到這個(gè)拷貝函數(shù)的運(yùn)行結(jié)果后,對(duì)c 指針不是很熟悉的可能看不太明白,以主函數(shù)中的輸出為例,我來發(fā)表一下自己的一點(diǎn)理解吧,如有錯(cuò)誤歡迎指正。
第一次調(diào)用函數(shù)mymemcpy( str 1, str 0, 9 ); 時(shí),str 1 傳入的是從字符"1"地址開始的指針地址,而str 0 傳入的是指針數(shù)組str的首地址指針,進(jìn)入函數(shù)內(nèi)部以后,兩個(gè)參數(shù)就和外部的指針數(shù)組str基本脫離了關(guān)系,轉(zhuǎn)換成字符指針后,dest是"123456789",src是"0123456789"因?yàn)榈刂肥墙徊娴?,所以拷貝?nèi)存時(shí),執(zhí)行if內(nèi)語句,這樣dest字符就變成了012345678,因?yàn)閐est和str指向的是同一塊內(nèi)存空間,而str從1地址開始變成了012345678,加上其原本首地址 0不變,所以輸出str時(shí)變成0012345678。如果不太明白可以看下另一篇日志,內(nèi)存拷貝函數(shù),應(yīng)該能很好的理解。
聯(lián)系客服