5.1.1
#include <stdio.h>
int i=1;
void main()
{
int i=i;
printf(" ");
}
注意,main()里面的i的值不是1。
原书给出的解释:
在C++中这样做是完全合法的(但显然不合理)。int
i=i,i变量从声明的那一刻开始就是可见的了,main()里的i不是1,因为它和main()外的i无关,而是一个未定义值。
5.1.2
#include <iostream>
using namespace std;
int main()
{
int x=2,y,z;
x *=(y=z=5); cout << x << endl;
/*
"="执行顺序是自右向左
z=5;
y=z;//y此时的值为5
x=x*y;//x此时的值为10
*/
z=3;
x ==(y=z); cout << x << endl;
/*
y=z;//y的值为3,z的值也为3.
x==3?//只是一个判断语句而已,不会改变x的值。但是x==3整个式子的值为0
*/
x =(y==z); cout << x << endl;
/*
y==z的值为1
x的值为1
*/
x =(y&z); cout << x << endl;
/*
&是按位与
y和z的十进制值为3,二进制值为0011。按位与的结果仍为0011。返回的值是十进制值。
*/
x =(y&&z); cout << x << endl;
/*
&&和||都是逻辑运算符。 &&(逻辑与) 、 ||(逻辑或) 。
作用:进行多项比较并将结果组合为单一的布尔值(注意这里:布尔值bool)。同时&&(逻辑与) 和 ||(逻辑或) 又是短路操作符,即左边的表达式为假时,将不再执行右边的表达式。
y&&z的值为1。我感觉只有y和z同时为0的时候表达式值才为0,但是y和z为非0的时候就都是1。
*/
y=4;
x=(y|z); cout << x << endl;
/*
|是按位或。y的十进制值为4,二进制值为0100。z的十进制值为3,二进制值为0011。按位或的结果为:
0100
0011
0111=7
*/
x=(y||z); cout << x << endl;
/*
没什么好说的。x的值为1。
*/
return 0;
}
运行结果:
5.1.3
#include <iostream>
using namespace std;
int func(int x)
{
int Count = 0;
while(x)
{
Count++;
x=x&(x-1);
/*
我一开始还以为是8421码。9999=1001 1001 1001 1001。错了。
9999的二进制数是10011100001111
10011100001111
10011100001110
=10011100001110=9998
10011100001110
10011100001101
=10011100001100=9996
10011100001100
10011100001011
=10011100001000=9992
10011100001000
10011100000111
=10011100000000=9984
10011100000000
10011011111111
=10011100000000=9728
发现规律。这是个找x的二进制值中有多少个1的算法。
*/
}
return Count;
}
int main(){
cout << func(9999) << endl;
return 0;
}
本题func函数返回值是形参x转化成二进制后包含1的数量。
运行结果:
有一个小细节是:书本的源代码的计数值是count,我直接复制过来运行的时候发现没有出现运算结果。然后把它改为Count运行后得出正确结果。
count的用法参考:https://blog.csdn.net/qq_36122764/article/details/82429976
count的作用:在序列中统计某个值出现的次数。
algorithm头文件定义了一个count的函数,其功能类似于find。这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。
每天进步一点。每天学习一点东西。慢慢积累吧。