151、写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值 int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a; 改后答案依次为9,10,10,11
152、某32位系统下, C++程序,请计算sizeof 的值 char str[] = “http://www.ibegroup.com/” char *p = str ; int n = 10; 请计算
(1)sizeof (str ) = ? (2)sizeof ( p ) = ? (3)sizeof ( n ) = ? void Foo ( char str[100]){ 请计算
sizeof( str ) = ?(4) }
void *p = malloc( 100 ); 请计算
sizeof ( p ) = ?(5) 答:(1)25 (2)4 (3) 4 (4)4 (5)4
157、strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值? 答:方便赋值给其他变量
158、MFC中CString是类型安全类么?
答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换
160、函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必须由程序员在程序中显式地指定。
161、 int i=10, j=10, k=3; k*=i+j; k最后的值是?
答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低
162、do??while和while??do有什么区别? 答 、前一个循环一遍再判断,后一个判断以后再循环
163、请写出下列代码的输出内容 #i nclude main() {
int a,b,c,d; a=10; b=a++; c=++a; d=10*a++;
printf(\,c,d:%d,%d,%d\,b,c,d); return 0; }
答 、10,12,120
164.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么? 答 、函数名: atol
功 能: 把字符串转换成长整型数
用 法: long atol(const char *nptr); 程序例: #include #include
int main(void) {
long l;
char *str = \ l = atol(lstr);
printf(\ return(0); }
165. 以下三条输出语句分别输出什么? char str1[] = \char str2[] = \const char str3[] = \const char str4[] = \const char* str5 = \
const char* str6 = \
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”
以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。
166 以下代码中的两个sizeof用法有问题吗?
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 {
for( size_t i=0; i char str[] = \ cout << \字符长度为: \UpperCase( str ); cout << str << endl; 答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。 167 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A? 答: a. class B : public A { ??} // B公有继承自A,可以是间接继承的 b. class B { operator A( ); } // B实现了隐式转化为A的转化 c. class A { A( const B& ); } // A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数 d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个 168.以下代码有什么问题? struct Test { Test( int ) {} Test() {} void fun() {} }; void main( void ) { Test a(1); a.fun(); Test b(); b.fun(); } 答:变量b定义出错。按默认构造函数定义对象,不需要加括号。 169 以下代码有什么问题? cout << (true?1:\ 答:三元表达式“?:”问号后面的两个操作数必须为同一类型。 170 以下代码能够编译通过吗,为什么? unsigned int const size1 = 2; char str1[ size1 ]; unsigned int temp = 0; cin >> temp; unsigned int const size2 = temp; char str2[ size2 ]; 答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。 171. 以下代码中的输出语句输出0吗,为什么? struct CLS { int m_i; CLS( int i ) : m_i(i) {} CLS() { CLS(0); } }; CLS obj; cout << obj.m_i << endl; 答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。 172 C++中的空类,默认产生哪些类成员函数? 答: class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const }; 173 以下两条输出语句分别输出什么? float a = 1.0f; cout << (int)a << endl; cout << (int&)a << endl; cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么? float b = 0.0f; cout << (int)b << endl; cout << (int&)b << endl; cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么? 答:分别输出false和true。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1,(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。 注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。 通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<及==选择正确的重载版 174、请简述以下两个for循环的优缺点(5分) for (i=0; i if (condition) DoSomething(); else DoOtherthing(); } if (condition) { for (i=0; i { for (i=0; i