1. charc = '\72'; 中的\72代表一个字符,72是八进制数,代表ASCII码字符“:”。
2. 10*a++ 中a先进行乘法运算再自增(笔试中经常喜欢出这类运算符优先级容易混淆的输出问题)。
3. const和static的作用
太常见的问题了,下面给出一个较详细的参考答案:
static关键字:
1)函数体内static变量的作用范围为函数体。不同于auto变量。该变量的内存只被分配一次。因此其值在下次调用时仍维持上次的值。
2)在模块内的static全局变量可以被模块内的所有函数访问。但不能被模块外的其他函数访问。
3)在模块内的static函数只可被这一模块内的其它函数调用。这个函数的使用范围被限制在声明它的模块内。
4)在类中的static成员变量属于整个类所有,对类的所有对象只有一份复制。
5)在类中的static成员函数属于整个类所有,这个函数不接受this指针,因而只能访问类的static成员变量。
const关键字:
1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化。因为以后就没有机会再改变它了。
2)对指针来说,可以指定指针的本身为const,也可以指定指针所指向的数为const。或二者同时为const。
3)在一个函数的声明中,const可以修饰形参,表明它是一个输入参数。在函数内不能改变其值。
4)对于类的成员函数,若指定其为const类型。则表明其是一个常量函数。不能修改类的成员变量。
5)对于类的成员函数,有时候必须指定其返回值为const类型。以使得其返回值不为“左值”。
4. 易误解:如果inta[5], 那么a与&a是等价的,因为两者地址相同。
解答:一定要注意a与&a是不一样的,虽然两者地址相同,但意义不一样,&a是整个数组对象的首地址,而a是数组首地址,也就是a[0]的地址,a的类型是int[5],a[0]的类型是int,因此&a+1相当于a的地址值加上sizeof(int) * 5,也就是a[5],下一个对象的地址,已经越界了,而a+1相当于a的地址加上sizeof(int),即a[1]的地址。
5.程序输出题:
charstr1[] = "abc";
charstr2[] = "abc";
constchar str3[] = "abc";
constchar str4[] = "abc";
constchar *str5 = "abc";
constchar *str6 = "abc";
char*str7 = "abc";
char*str8 = "abc";
cout<< (str1 == str2) << endl;
cout<< (str3 == str4) << endl;
cout<< (str5 == str6) << endl;
cout<< (str7 == str8) << endl;
输出:0 0 1 1
说明:输出str1~str8的地址为:
0x23aa80
0x23aa70
0x23aa60
0x23aa50
0x23aa48
0x23aa40
0x23aa38
0x23aa30
输出str1~str8内容“abc”的存储地址为:
0x23aa80
0x23aa70
0x23aa60
0x23aa50
0x100403030
0x100403030
0x100403030
0x100403030
可以发现str1~str4中的内容是存在栈上,地址各不相同,而str5~str8的内容都是存储在常量区,所以地址都相同。
注意:
char *str ="abc";
printf("%p\n",str1);
cout<< &str1 << endl;
上面打印的是字符串 “abc”的地址,下面打印的是 str1 变量的地址。
6.在C++中参数传递只有值传递和引用传递,地址传递指的是指针传递,而指针传递本质上也是值传递(指针值)
7.假设x=9981,下面函数的返回值是?
int func(x)
{
int countx=0;
while(x)
{
countx++;
x=x&(x-1);
}
return countx;
}
先转2进制为10011011111101,每次x&(x-1)会让原来的1(从低位到高位依次)变为0。一共10个1,10次循环之后x为0,退出循环。
8. 32位系统 64位系统 (单位Bytes)
char 1 1
short 2 2
int 4 4
指针 4 8
long 4 8
float 4 4
double 8 8