几道C++经典面试题2
来源:互联网 发布:ubuntu 重装桌面环境 编辑:程序博客网 时间:2024/06/06 02:10
1.int a=5,则 ++(a++)的值是()
a++返回的是一个临时变量,这里是右值,不能再前面++了,编译error C2105: '++' needs l-value
2.下面的代码输出什么?
- int main(void)
- {
- int a[5] = {1, 2, 3, 4, 5};
- int *ptr = (int *)(&a+1);
- printf("%d %d",*(a+1),*(ptr-1));
- return 0;
- }
- 注意区别a+1与&a+1
- A、1 6 B、2 4 C、2 5 D、1 5
- a是一个指向数组的指针(行指针),a的步长就是数组的长度。也就是说执行&a+1时,a要跨过n个整型数据的长度,输出*ptr就会发现越界了,是一个随机值,那么ptr-1的值就是数组的最后一个值了。
3、以下三条输出语句分别输出什么?
- char str1[] = "abc";
- char str2[] = "abc";
- const char str3[] = "abc";
- const char str4[] = "abc";
- const char* str5 = "abc";
- const char* str6 = "abc";
- cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
- cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
- cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?
答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,所以相等。
4.以下代码中的两个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' );
- }
- }
- }
5.以下代码有什么问题?
- cout<< (true?1:"0") <<endl;
类型不匹配,1与“0”
6.
vector<int> veci;
veci.push_back(1);
veci.push_back(2);
veci.push_back(3);
veci.push_back(4);
veci.push_back(5);
veci.push_back(3);
veci.push_back(2);
veci.push_back(3);
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 3)
veci.erase(iter);
}
乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。
查看MSDN,对于erase的返回值是这样描述的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
{
if( *iter == 3)
iter = veci.erase(iter);
}
这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)
正确的代码应该为:
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if( *iter == 3)
iter = veci.erase(iter);
else
iter ++ ;
}
最好用remove代替
- 几道C++经典面试题2
- 几道C++经典面试题
- 经典C面试题
- 面试题几道--C/C++
- C#,.Net经典面试题
- 经典C语言面试题
- 经典C/C++面试题
- 经典C/C++面试题
- 经典C/C++面试题
- 经典C/C++面试题
- 嵌入式c面试题 经典~~
- 经典C/C++面试题
- C/C++ 经典 面试题
- 经典C/c++面试题
- C、c++经典面试题
- 经典C/C++面试题
- 经典C/C++面试题
- 经典C语言面试题
- 设计模之工厂模式
- android 中文 api (64) —— Scroller
- 数据库客户端配置
- Leetcode Same Tree
- http与https的区别
- 几道C++经典面试题2
- 【IOS异常汇总】之 implicit conversion of Object-C pointer type"NSString *" to C pointer type "const void *"
- 搭建qt的交叉编译环境
- mysql查看帮助
- WebLogic连接池配置数据库断掉后自动重连设置
- 揭开Spring事务处理
- php实现某一操作“确认、取消”对话框的问题
- 机房收费系统Number two
- 【Qt官方视频码农】Qt_07-Basic_Application_and_HTML_Aware_Widgets