標籤:
1.(http://group.jobbole.com/13838/)
搜狗2016研發工程師筆試題
1 int main(int argc, char *argv[]) 2 { 3 string a="hello world"; 4 string b=a; 5 if (a.c_str()==b.c_str()) 6 { 7 cout<<"true"<<endl; 8 } 9 else cout<<"false"<<endl;10 string c=b;11 c="";12 if (a.c_str()==b.c_str())13 {14 cout<<"true"<<endl;15 }16 else cout<<"false"<<endl;17 a="";18 if (a.c_str()==b.c_str())19 {20 cout<<"true"<<endl;21 }22 else cout<<"false"<<endl;23 return 0;24 }
關於代碼輸出正確的結果是( )
- false false false
- true false false
- true true true
- true true false
在我的windows10+tdm gcc 5.x上運行結果是 全 false
而根據gdb中調試的結果可以看出,c_str返回的是一個字元指標,也就是說每一個string對象應用此函數的結果都是產生一個字元數組,這個數組的首地址指標被返回,而且根據後續的調試,比如a=""之後的結果來看,這個數組的首地址位置是固定的,也就是說,第一次對a.c_str返回的指標如果是
(gdb) p a.c_str()
$1 = 0x24fe20 "hello world"
在a=""之後
(gdb) p a.c_str()
$6 = 0x24fe20 ""
地址沒變。
所以,上面的所有a和b的c_str結果對比都不相等。
另外c++ primer 5 中的知識點,使用b=a和使用b(a)效果相似,是進行的拷貝初始化而非直接初始化,因此兩個對象不相同,但是對於重載的==來說,是根據包含的字元相同則返回true。
網上找的一些筆試題