程序设计基础概念之
赋值语句:
面试例题1: 下面C++代码的输出结果是什么?
//C/C++ code
int i = 1;
void main()
{
int i = i;
}
A.main()里的i是一个未定义值
B.main()里的i值为1
C.编译器不允许这种做法
D.main()里的i值为0
解析:当面试者看到int i=i;的时候,可能会认为编译器不允许这种写法,即无法通过编译。
但是在C++中,这样做是完全合法的,只是不合理而已。下面来分析是如何不合理的,在int i=i,
i变量从声明的那一刻就是可见的了,但是main()里面的i不是1,因为它与外面的i无关,
所以就不能用i去初始化i,因此main()里面的i(指的是右边的i)是一个未定义的值。
在VS2017中编译通过,不能运行,但是有编译警告:
warning C4700: 使用了未初始化的局部变量“i”
所以答案是 A
面试例题2:下面程序的输出结果是多少?
#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 = x*y,得到x是10 。
x == (y=z) 是先把z的值赋值给y,在比较x与y的值是否相等,无论x与y的值是否相等,
x的值都不会改变,所以x还是10 。
x = (y==z) 是先判断y与z的值是否相等,如果相等,结果是1,赋值给x;
否则,结果是0,赋值给x。得到x是1 。
x = (y&z) 是先y与z进行按位与运算。再将结果赋值给x,所以x是3 。
x = (y&&z) 是先把y与z进行与运算,当且仅当y与z都为真时,返回一个布尔值,
x为真,也就是1 。
x = (y|z) 是先把y与z进行按位或运算,再把结果赋值给x,所以x结果是7 。
x = (y||z) 是将y与z进行或运算,再将结果赋值给x,所以x的值是1 。
所以答案是: 10,10,1,3,1,7,1。
面试例题3:以下代码结果是多少?
#include <iostream>
using namespace std;
int func(int x)
{
int count = 0;
while (x)
{
count++;
x = x & (x - 1);
}
return count;
}
int main()
{
cout << func(9999) << endl;
return 0;
}
解析:这里func函数的作用是返回 x转换成二进制后,其中含有1的数量。
只要知道这一点,就很好解答了。将9999转换成二进制是:10011100001111,
1的个数是8。
所以答案是8