第五章 程序设计基础概念(一)

      面试中除了对项目经验有所询问外,最好的考量的办法就是基本功。包括编程风格、对赋值语句、递增语句、数据交换、类型转换等程序设计基本概念的理解。

5.1 赋值语句

面试例题1What does the following program print?(下面程序的结果是多少?)【中国台湾某著名计算机硬件公司200512月面试题】(请先自己做一下,然后最好自己编写到编译器上运行,看看结果)

#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




 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡唯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值