【笔试准备】写出程序输出结果C/C++

以下是我在准备面试准备过程中遇到的一些问题,且每一道题我都在编译器中敲过,希望也对准备面试的朋友有帮助。

一、赋值语句

1、

#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
    int x = 2,y,z;
    x *= (y = z = 5); cout<<x<<"\t";
    z = 3;
    x == (y = z); cout<<x<<"\t";
    x = (y==z); cout<<x<<"\t";
    x = (y & z); cout<<x<<"\t";
    x = (y && z); cout<<x<<"\t";
    y = 4;
    x = (y | z); cout<<x<<"\t";
    x = (y || z); cout<<x<<"\t";
    return 0;
}

解析:”x*=(y=z=5)”,说明5赋值给z,z再赋值给y,x=x*y,所以为2*5=10。
“x == (y=z)”,z赋值给y,然后比较x和y是否相等。无论是否相等,x的值不会变仍为10。
“x=(y==z)” y和z是否相等,返回一个布尔值1,所以x的值为1
“x=(y&z)”的意思是说首先使y和z按位与。y是3,z也是3。y的二进制数位是0011,z的二进制数位也是0011,按位与之后得到的结果仍是3。
“x=(y&&z)”的意思是说首先使y和z进行与运算。与运算是指如果y为真,z为真,则(y&&z)为真,返回一个布尔值1。这时y、z都是3,所以为真,返回1,所以x为1。
“x=(y|z)”的意思是说首先使y和z按位或。y是4,z是3。y的二进制数位是0100,z的二进制数位是0011,按位或之后,得到7。
“x=(y||z)”的意思是说首先使y和z进行或运算。或运算是指如果y和z中有一个为真,则(y||z)为真,返回一个布尔值1。这时y、z都是真,所以为真,返回1。所以x为1。

答案:10 10 1 3 1 7 1

2、

#include <cstdlib>
#include <iostream>
using namespace std;
int func(int x) {
    int count = 0;
    while(x) {
        x = x & (x-1);
        count ++;
    }
    return count;
}
int main() {
    cout<<func(9999);
    return 0;
}

解析:func函数求的是x转化成二进制后包含1的数量,9999转化为二进制为10011100001111,8个1,所以输出结果为8.(这个问题称为Hamming Distance汉明距离)
答案:8

二、i++

1、

#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
    int i = 5;
    i += i++;
    cout << i;
    return 0;
}

解析:
“++”运算符的优先级是比“+=”要高,所以先计算i++为6,再进行i += 6,所以i最后的结果为11。
答案:
11

猜你喜欢

转载自blog.csdn.net/u013190088/article/details/76160163