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++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题