C/C++ 面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++ 面试题相关的知识,希望对你有一定的参考价值。

求一个整数,二进制表示出来里面,有多少个1



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


int main(void)
{
        cout << func(9999) << endl;
        return 0;

}

[email protected]:~$ g++ main.cpp && ./a.out 
8




关于i++,++i

#include <iostream>
using namespace std;
int main(void)
{
        int a,x;
        for(a=0,x=0; a<=1 && !x++;a++)
        {
                a++;
        }
        cout<<a<<x<<endl;
        return 0;
}
[email protected]:~$ g++ main.cpp && ./a.out 
21
#include <iostream>
using namespace std;
int main(void)
{
        int a,x;
        for(a=0,x=0; a<=1 && !x++;)
        {
                a++;
        }
        cout<<a<<x<<endl;
        return 0;
}
[email protected]:~$ g++ main.cpp && ./a.out 
12


解析:这两段代码的不同点就在for循环那里,前者是for(a=0,x=0; a<=1 &&!x++;a++),
后者是for(a=0,x=0;a<=1 &&!x++;)。
先说第1段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:执行for(a=0,x=0;a<=1 &&!x++;a++)中的a++,a自增为2。
第6步:a现在是2,已经不符合小于等于1的条件了,所以“&&”后面的“!x++”不执行,x还是1,不执行循环体。
第7步:打印a和b,分别是2和1。


再说第2段代码。
第1步:初始化定义a=0,x=0。
第2步:a小于等于1,x的非为1,符合循环条件。
第3步:x++后x自增为1。
第4步:进入循环体,a++,a自增为1。
第5步:a现在是1,符合小于等于1的条件,所以“&&”后面的“!x++”被执行,x现在是1,x的非为0,不符合循环条件,不执行循环体,但x++依然执行,自增为2。
第6步:打印a和b,分别是1和2。
答案:第一段输出结果是21,第二段输出结果是12。

#include <stdio.h>
int main(void)
{
        int b =3;
        int arr[] = {6,7,8,9,10};
        int *p = arr;
        *(p++) += 123;
        printf("%d,%d\n",*p,*(++p));
}
[email protected]:~$ gcc main.c && ./a.out 
8,8

解析:C中printf计算参数时是从右到左压栈的。
几个输出结果分别如下:
printf("%d\n ",*ptr);此时ptr应指向第一个元素6。
*(ptr++)+=123应为*ptr=*ptr+123;ptr++,此时ptr应指向第二个元素7。
printf("%d\n ",*(ptr-1));此时输出第一个元素129,注意此时是经过计算的。
printf("%d\n ",*ptr);此时输出第二个元素7,此时ptr还是指向第二个元素7。
printf("%d,%d\n",*ptr,*(++ptr));从右到左运算,第一个是(++ptr),也就是ptr++,*ptr=8,此时ptr指向第三个元素8,所以全部为8。










本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1782555

以上是关于C/C++ 面试题的主要内容,如果未能解决你的问题,请参考以下文章

C/C++指针的经典笔试面试题

C/C++指针的经典笔试面试题

[C/C++笔试面试题] 程序设计基础 - 位操作函数数组篇

面试题七 C/C++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题

面试题七 C/C++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题

c/c++ 经典面试题