面试中除了对项目经验有所询问外,最好的考量的办法就是基本功。包括编程风格、对赋值语句、递增语句、数据交换、类型转换等程序设计基本概念的理解。
5.1 赋值语句
面试例题1:What does the following program print?(下面程序的结果是多少?)【中国台湾某著名计算机硬件公司2005年12月面试题】(请先自己做一下,然后最好自己编写到编译器上运行,看看结果)
#include <iostream>
using namespace std;
int main()
{
int x = 2, y, z;
x *= (y = z = 5);
cout << x << endl;
z = 3;
x == (y = z);
cout << x << endl;
x = (y == z);
cout << x << endl;
x = (y & z);
cout << x << endl;
x = (y && z);
cout << x << endl;
y = 4;
x = (y | z);
cout << x << endl;
x = (y || z);
cout << x << endl;
return 0;
}
这与这个程序,最要是理解运算符号的意思。这就比较考查基本功了,只要对这些基础知识有一定的理解,那么解出这道题就不困难了。
x *= (y = z = 5);
这条语句的意思是把5赋值给z,然后把z的值赋值给y,最后,用x*y的值赋给x。那么这条语句就相当于这样的三条语句:
z = 5;
y = z;
x *= y;
这样就好理解原来那条语句。那么很容易得出答案:x = 10;
z = 3;
x == (y = z);
这两条语句,第一条是给z赋值为3,下面的一条语句需要理解‘==’的意思。‘==’的意思是相等的意思。如 A == B 判断的是A是否与B相等。如果相等,这个结果就是true(整型值1),否则就是false(整型值0)。
但是在上面这条语句中,只是比较x是否与和z相等的y值相等。比较的结果却没有交付给任何变量。那么这条语句相当于就是无用的一条语句。没有修改x的值。则,x的值仍然为10。
x = (y == z);
首先判断y是否与z相等。然后把判断结果赋值给x,而由上面y和z相等,那么x的值为1.
x = (y & z);
这条语句需要理解‘&’的意思。'&'表示位与。那么y和z的二进制都为0011,相与后结果仍为0011,则x的值是3.
x = (y && z);
'&&'的意思是相与,因为y和z的值为3,大于零,则(y&&z)的结果就是true(1),那么x的值就为1;
x = (y | z);
x = (y || z);
和‘&’,‘&&’的意思一样,只是意思分别为位相或和相或。结果分别是7和1.
综合上面的解释。答案为: 10, 10, 1, 3, 1, 7, 1
面试例题2:What does the following program print?(下面程序的结果是多少?)【中国某著名计算机金融软件公司2005年12月面试题】
#include <iostream>
using namespace std;
int vac = 3;
int main()
{
int vac = 10;
::vac++;
cout << ::vac << endl;
cout << vac << endl;
return 0;
}
A 、11 11 B、 11 4 C、 10 4 D、 4 10
本题主要是了解全局变量和局部变量,以及‘::’域作用的理解。
::vac++是对全局变量加1,因此该题答案为:D。
5.2 i++
面试试题1:What will be the output of the following code(assume the necessary include file are present?)【中国台湾某著名杀毒软件公司2005年10月面试题】
int i = 3, j = 4;
j? i++: ++j;
printf("%d %d\n",i,j);
A 、3 3 B、 4 4 C、 3 4 D、 4 3
本题主要理解?:;的理解。
答案为:B。
面试例题2:一下代码的输出结果是()。【中国某著名计算机金融软件公司2005年面试题】
int i = 1, j = 2;
int k = i+++j;
cout << k << endl;
A、2 B、3 C、4 D、5
int k = i+++j;相当于int k = (i++) + j;i++是后自增,因此先使用i,再把i加1,即:k = i + j; i = i + 1.答案为:B。
面试例题3:x = x + 1; x += 1; x++哪个效率最高?为什么?
解析:
x = x + 1最低,因为它的执行过程如下:
(1)读取右x的地址。
(2)x + 1.
(3)读取左x的地址。
(4)将右值传给左边的x(编译器并不认为左右x的地址相同)
x += 1;其次,其执行过程如下:
(1)读取右x的地址。
(2)x + 1.
(3)将得到的值传给x(因为x的地址已经读取)。
x++的效率最高,其执行过程如下:
(1)读取右x的地址。
(2)x自增1.
答案:x++的效率最高。
面试例题4:What will be the output of the following c code?【中国台湾某著名CPU生产公司2005年面试题】
#define product(x) (x * x)
int main()
{
int i = 3, j, k;
j = product(i++);
k = product(++i);
printf("j = %d, k = %d", j, k);
return 0;
}
扩展j = product(i++)和k = product(++i);即
j = (i++) * (i++);
k = (++i) * (++i);
答案为:9、49
面试例题5:If there are "int a = 5, b = 3;", the values of a and b are () and () after execute "!a&&b++;"
A、5 3 B、 0 1 C、0 3 D、5 4
!a以为假,短路运算,后面不再继续。
答案:A