ch5 1.
#includeusing namespace std;int i = 1;int main(){ int i = i; cout< <
#includeusing namespace std;int func(int x){ int count = 0; while(x){ count++; x = x&(x - 1); } return count;}int main(){ cout< <
int count_zero(int x){ int count = 0; int count_one = 0; while(x){ count_one += x&1; count++; x = x>>1; } return count - count_one;}
#includeint main(){ int b = 3; int arr[] = { 6,7,8,9,10}; int * ptr = arr; *(ptr++) += 123; printf("%d,%d\n",*ptr,*(++ptr)); return 0;}
衡量参数在栈上的位置,就是离开确切的 函数调用点(call f)有多远。已经确定的参数,它在栈上的位置,
不应该依 赖参数的具体数量,因为参数的数量是未知的!
所以,选择只能是,已经确定的参 数,离开函数调用点有确定的距离(较近)。满足这
个条件,只有参数入栈遵从自右向左规则。 也就是说,左边确定的参数后入栈,离函数调用点有确定的距离(最左边的参数最后入栈,离函 数调用点最近)。这样,当函数开始执行后,它能找到 所有已经确定的参数。根据函数自己的逻辑,它负
责寻找和解释后面可变的参数(在离开调用点 较远的地方),通常这依赖于已经确定的参数的值(典型的如prinf()函 数的格式解释,遗憾的是这样的方式具有脆弱性)。 详情请看:#includeusing namespace std;int main(){ float a = 1.0f; cout << (int)a << endl; cout << (int&)a << endl; cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么? float b = 0.0f; cout << (int)b << endl; cout << (int&)b << endl; cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么? return 0;}
(int &)a 就表示 不管 a 是什么,我都当他是一个int变量。
从机器码的角度来说,变量a会被翻译成一个内存地址,(int &)a 就是说,这个内存地址里的内容它是一个整数。
(int)a 呢不同:如果 a 不是整数,就会按规则转换成整数,存入另一个地址(或临时变量)中去。
浮点数的 1.0f 在内存里是这样表示的:
0011 1111 1000 0000 00000000 00000000
这个32位二进制数被当作整数输出就是:
2^29+2^28+2^27+2^26+2^25+2^24+2^23=1065353216
而整数的 1 在内存里是这样表示的:
0000 0000 0000 0000 00000000 00000001
(int&)a 相当于*(int*)&a ; *(int*)(&a) ; *((int*)&a)
所以 (int)a != (int&)a
浮点的0和整数的0 在内存里都是:
0000 0000 0000 0000 00000000 00000000
所以 (int)b == (int&)b
参考:http://blog.csdn.net/cszdhhz/article/details/6877333#
考察点二:
另外,boolalpha的作用是使bool型变量按照false、true的格式输出。如不使用该标识符,那么结果会按照1、0的格式输出。
#includeint main(){ unsigned int a = 0xFFFFFFF7; unsigned char i = (unsigned char)a; char* b = (char *)&a; printf("%08x,%08x",i,*b);//8位16进制数 return 0;}
int f(int x,int y){ return (x&y) + ((x^y)>>1);}
int sum(int x,int y){ return ((x&y<<1) + (x^y));}
#include#include using namespace std; int main(){ int a =0,b = 0; cin>>a>>b; int c = a - b; char*strs[2] = { "a Large","b Large"}; c = unsigned(c) >> (sizeof(int) * 8 - 1); cout< <
8.
#includeusing namespace std; inline int max(int a,int b){ return a>=b?a:b;}inline int min(int a,int b){ return a<=b?a:b;}inline int medium(int a,int b,int c){ int t1 = max(a,b); int t2 = max(b,c); int t3 = max(a,c); return min(t1,min(t2,t3));}int main(){ cout<
#includeusing namespace std;int main(){ int a = 0,b = 0; cin>>a>>b; a = a + b;//可能会越界,如果a、b都比较大的话! b = a - b; a = a - b; cout< <<" "<<
#includeusing namespace std; int main(){ int n = 'c'; switch(n++){ default:printf("error");break; case 'a':case 'A':case 'b':case 'B':printf("ab");break; case 'c':case 'C':printf("c"); case 'd':case 'D':printf("d"); } return 0;}