标签: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; } chunli@pc0003:~$ 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; } chunli@pc0003:~$ 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; } chunli@pc0003:~$ 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)); } chunli@pc0003:~$ 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++ 面试题
原文地址:http://990487026.blog.51cto.com/10133282/1782555