永发信息网

几个简单的C++问题

答案:5  悬赏:0  手机版
解决时间 2021-11-10 14:22
几个简单的C++问题
最佳答案
1.已知:char ss[][6]={"while","for","else","break"}; 输出显示"reak"字符串的表达式

为什么答案是 ss[3]+1 数组可以这样表示么?

-----------------------------------------------------------------------
ss[3]表示第4个一维数组"break";ss[3][1]=ss[3]+1表示第四个一维数组的第2个地址"r";按%s输出遇到'\0'结束,于是
输出reak;
-----------------------------------------------------------------------
2.为什么cout<<~4<-----------------------------------------------------------------------
~ 在C叫按为取反:2进制位取反(1得到0,0得到1)
4=00000100
~4=11111011(补码)=11111010(反码)=10000101(原码)[首为是符号不管]=-5
------------------------------------------------------------------------

3. 为什么cout<<(5<<2)+(5>>2)<>2)的值为什么是1不是1.01?
-----------------------------------------------------------------------
(5<<2)+(5>>2)=(00000101<<2)+(00000101>>2)=5*2*2+5/2/2=20+1=21(按位没有小数出现,右移出界的位直接删除)
-----------------------------------------------------------------------

4.#include
int a=8;
void main()
{
int b=6;
double d=1.5;
d+=a+b;
cout<<(a<0?a:b<0?a++:b++);
}

的值为什么为2, 解释下过程。
-----------------------------------------------------------------------
int a=8;
int b=6;
double d=1.5;
d+=a+b;
后:a=8,b=6,d=15.5;
(a<0?a:b<0?a++:b++) :从右边的三目运算开始 (a<0?a:6)[为什么不是7?因为先取值在加1],于是这个表达式=6,你答案错了

---------------------------------------------------------------------------
5.int a[]={5,4,3,2,1};
int*p=&a[2];

为什么指针可以这样定义,这样不是指向地址了?
--------------------------------------------------------------------------
指针本就是指向地址的变量 int * p=a;表示指向数组开始,等同与int * p=&a[0];
--------------------------------------------------------------------------

6.#include
int a[]={10,9,6,5,4,2,1};
void main()
{
int n(7),i(7),x(7);
while(x>*(a+i))
{
*(a+i+1)=*(a+i);
i--;
}
*(a+i+1)=x;
for(i=0;icout<<*(a+i)<<',';
cout<
}

为什么可以执行*(a+7) ? 不是数组在初始化的时候已经定义只有7位了么?
-----------------------------------------------------------------------------
数组不能下标越界,但是指针可随便使用,没有界限:
int i[2]={1,2},*p=i;
*(p+5)=10;
printf("%d\n",*(p+5));
同样OK!但是不建议这样
-----------------------------------------------------------------------------

7.#include
class A
{
public:
A(int i)
{a=i;}
A()
{
a=0;
cout<<"调用缺省构造函数."<}
~A()
{
cout<<"调用析构函数."<}
void print()
{ coutint a;

};

void main()
{
A a[4],*p;
int n=1;
p=a;
for(int i=0;i<4;i++)
a[i]=A(++n);
for(i=0;i<4;i++)
(p+i)->print();
}

输出结果为:

调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用析构函数.2
调用析构函数.3
调用析构函数.4
调用析构函数.5
2
3
4
5
调用析构函数.5
调用析构函数.4
调用析构函数.3
调用析构函数.2

第一次调用析构函数是在什么时候调用的,调用的原因是因为a[4]被释放了么?
为什么调用的次序是正向的;不是先赋值后析构么?
----------------------------------------------------------------------------------------------
首先A a[4];调用缺省构造输出 "调用缺省构造函数.0 "
再是for(...) a[i]=A(++n); 调用参数构造输出 "调用析构函数.2"
然后for(...) printf(); 调用print()输出 2 3 4 5
最后析构,因为数组释放从高到底于是从a[3]开始析构
------------------------------------------------------------------------------------------------1.已知:char ss[][6]={"while","for","else","break"}; 输出显示"reak"字符串的表达式

为什么答案是 ss[3]+1 数组可以这样表示么?

-----------------------------------------------------------------------
ss[3]表示第4个一维数组"break";ss[3][1]=ss[3]+1表示第四个一维数组的第2个地址"r";按%s输出遇到'\0'结束,于是
输出reak;
-----------------------------------------------------------------------
2.为什么cout<<~4<-----------------------------------------------------------------------
~ 在C叫按为取反:2进制位取反(1得到0,0得到1)
4=00000100
~4=11111011(补码)=11111010(反码)=10000101(原码)[首为是符号不管]=-5
------------------------------------------------------------------------

3. 为什么cout<<(5<<2)+(5>>2)<>2)的值为什么是1不是1.01?
-----------------------------------------------------------------------
(5<<2)+(5>>2)=(00000101<<2)+(00000101>>2)=5*2*2+5/2/2=20+1=21(按位没有小数出现,右移出界的位直接删除)
-----------------------------------------------------------------------

4.#include
int a=8;
void main()
{
int b=6;
double d=1.5;
d+=a+b;
cout<<(a<0?a:b<0?a++:b++);
}

的值为什么为2, 解释下过程。
-----------------------------------------------------------------------
int a=8;
int b=6;
double d=1.5;
d+=a+b;
后:a=8,b=6,d=15.5;
(a<0?a:b<0?a++:b++) :从右边的三目运算开始 (a<0?a:6)[为什么不是7?因为先取值在加1],于是这个表达式=6,你答案错了

---------------------------------------------------------------------------
5.int a[]={5,4,3,2,1};
int*p=&a[2];

为什么指针可以这样定义,这样不是指向地址了?
--------------------------------------------------------------------------
指针本就是指向地址的变量 int * p=a;表示指向数组开始,等同与int * p=&a[0];
--------------------------------------------------------------------------

6.#include
int a[]={10,9,6,5,4,2,1};
void main()
{
int n(7),i(7),x(7);
while(x>*(a+i))
{
*(a+i+1)=*(a+i);
i--;
}
*(a+i+1)=x;
for(i=0;icout<<*(a+i)<<',';
cout<
}

为什么可以执行*(a+7) ? 不是数组在初始化的时候已经定义只有7位了么?
-----------------------------------------------------------------------------
数组不能下标越界,但是指针可随便使用,没有界限:
int i[2]={1,2},*p=i;
*(p+5)=10;
printf("%d\n",*(p+5));
同样OK!但是不建议这样
-----------------------------------------------------------------------------

7.#include
class A
{
public:
A(int i)
{a=i;}
A()
{
a=0;
cout<<"调用缺省构造函数."<}
~A()
{
cout<<"调用析构函数."<}
void print()
{ coutint a;

};

void main()
{
A a[4],*p;
int n=1;
p=a;
for(int i=0;i<4;i++)
a[i]=A(++n);
for(i=0;i<4;i++)
(p+i)->print();
}

输出结果为:

调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用析构函数.2
调用析构函数.3
调用析构函数.4
调用析构函数.5
2
3
4
5
调用析构函数.5
调用析构函数.4
调用析构函数.3
调用析构函数.2

第一次调用析构函数是在什么时候调用的,调用的原因是因为a[4]被释放了么?
为什么调用的次序是正向的;不是先赋值后析构么?
----------------------------------------------------------------------------------------------
首先A a[4];调用缺省构造输出 "调用缺省构造函数.0 "
再是for(...) a[i]=A(++n); 调用参数构造输出 "调用析构函数.2"
然后for(...) printf(); 调用print()输出 2 3 4 5
最后析构,因为数组释放从高到底于是从a[3]开始析构
------------------------------------------------------------------------------------------------
全部回答
1.已知:char ss[][6]={"while","for","else","break"}; 输出显示"reak"字符串的表达式

为什么答案是 ss[3]+1 数组可以这样表示么?
答:这个表达式的值是 地址,所以符合题意。

2.为什么cout<<~4<答:不懂

3. 为什么cout<<(5<<2)+(5>>2)<>2)的值为什么是1不是1.01?
答:5 对应的二进制式:0101 ,5>>2 对应 0001 [01]被移掉
所以答案是 5*4+1 = 21.

4.#include
int a=8;
void main()
{
int b=6;
double d=1.5;
d+=a+b;
cout<<(a<0?a:b<0?a++:b++);
}

的值为什么为2, 解释下过程。
答:应该是 6 ,要么题写错了。

5.int a[]={5,4,3,2,1};
int* p = &a[2];

为什么指针可以这样定义,这样不是指向地址了?
答:这是把地址赋给指针,不是指向地址,记住,要看指针指向什么类型的值,取决于地址对应的内存中存储的什么类型的值(仅限于指针定义)

6.#include
int a[]={10,9,6,5,4,2,1};
void main()
{
int n(7),i(7),x(7);
while(x>*(a+i))
{
*(a+i+1)=*(a+i);
i--;
}
*(a+i+1)=x;
for(i=0;icout<<*(a+i)<<',';
cout<
}

为什么可以执行*(a+7) ? 不是数组在初始化的时候已经定义只有7位了么?
答:可以执行,但是是不可预料的。

7.#include
class A
{
public:
A(int i)
{a=i;}
A()
{
a=0;
cout<<"调用缺省构造函数."<}
~A()
{
cout<<"调用析构函数."<}
void print()
{ coutint a;

};

void main()
{
A a[4],*p;
int n=1;
p=a;
for(int i=0;i<4;i++)
a[i]=A(++n);
for(i=0;i<4;i++)
(p+i)->print();
}

输出结果为:

调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用析构函数.2
调用析构函数.3
调用析构函数.4
调用析构函数.5
2
3
4
5
调用析构函数.5
调用析构函数.4
调用析构函数.3
调用析构函数.2

第一次调用析构函数是在什么时候调用的,调用的原因是因为a[4]被释放了么?
为什么调用的次序是正向的;不是先赋值后析构么?
答:

A a[4];//定义4个A对象,调用4次类A的默认构造函数。
于是有以下输出:
调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0
调用缺省构造函数.0

for(int i=0;i<4;i++)
a[i]=A(++n);
//每一次循环定义一个临时A对象,调用类A的 带参构造函数,同时每一次循环结束时,临时对象销毁,调用类A的析构函数。
于是有以下输出:
调用析构函数.2
调用析构函数.3
调用析构函数.4
调用析构函数.5

for(i=0;i<4;i++)
(p+i)->print();
调用每一个数组元素的成员函数,由于初始化值不同,所以输出不同。
于是有以下输出:
2
3
4
5

最后,在这个程序结束是时,系统销毁A对象数组 a[4],每一个对象的销毁都调用类A的析构函数。
于是有了以下输出:
调用析构函数.5
调用析构函数.4
调用析构函数.3
调用析构函数.2

注意:这段析构对应的是第一段输出的构造,并不是中间的那一段,中间的那一段析构有对应的构造,只不过它没有输出什么(只是对类A的数据成员 a 赋值),所以你看不出来。
第一个问题记住就可以了,至于为什么会输出字符串,我想应该清楚吧。
第二个问题,~是按位取反运算,用补码表示的,你自己算一下就明白了。
第三个问题,移位运算,低位向右移时,原来低位已不存在了,哪还有0.01。
第四个问题,结果应该是6,而不是2.过程为先算b<0?a++:b++;
显然b<0不成立,所以去b++。此时得到6,(运算完后b才变为7),
然后算a<0?a:6,显然答案为6.
第五个问题,a[2]表示第三个数,&a[2]就是地址。当然也可以写成int *p=a+2;
第六个问题,根本就没有执行*(a+7)。(i<7)。
最后一个问题,析构函数的调用是正向的???
1.ss[3]+1表示数组ss的第4个元素的、第二个字符开始计起的字符串,二位数组可以理解为存储为:
0 1 2 3 4
0 w h i l e
1 f o r
2 e l s e
3 b r e a k
ss[3]+1则表示3行1类开始的字符串,即reak

2.~4是表示对4的二进制代码取反,也就是-5

3.(5<<2)表示将5的二进制码左移2位,00000101左移后变为00010100,即20,(5>>2)表示将5的二进制码右移2位,高位补0,00000101右移后变为00000001,即1 ,所以(5<<2)+(5>>2)结果为21

4.那个代码我没怎么看懂,cout<<(a<0?a:b<0?a++:b++); 是选择语句吗?

5.把数组的元素赋值给指针变量的时候就是要这么定义的,要对元素取地址再传递给指针,如果是把数组赋值格指针时,可以直接把数组名或者数组的首元素赋给指针变量

6.*(a+7) 是达不到的,上面for语句的循环条件设置为i
7.在声明A类型变量时,调用4次缺省构造函数,来对数组初始化,然后再对数组变量重新赋值的时候,调用析构函数,每次a的值都先改变后析构,亿就是说a被改变一个,析构一个,再调用带参数的构造函数。所以输出为2345,然后由for(i=0;i<4;i++)
(p+i)->print();
正向调用print(),输出为2345
在最后主函数结束,析构时与构造相反,为逆向5432
十万个为什么?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
45.6÷6简算
鸿禧茶楼(海盈路)地址在什么地方,我要处理点
2乘几小于8010
七里香麻辣烫在哪里啊,我有事要去这个地方
飞机起飞后是如何给机舱内加压的?
有什么软件可以免费看各大应用VIP电影
入伏从什么时候开始,每伏几天
云南芒市或者了解芒市的朋友进来看看啊~~~
小米怎么刷卡
卓越食宿学习班地址在什么地方,想过去办事,
矿用通信电缆,MHYV-30*2*0.8,0.9mm,0.7,0
求房山电动出租车叫车电话
从彭刘杨路239号到地铁四号线有多远
羽毛纱的介绍
由南向北这个字谜,谜底是申吗?
推荐资讯
美洲苹果服饰我想知道这个在什么地方
租的车一直没还,怎么证明车辆被承租方一直占
拨开是什么意思
上市公司出现退市预警后多久退市
六单元耳机和四单元耳机有什么区别
一鹤道长:王母娘娘和玉皇大帝到底是什么关系
听说辣鱼仔吃死人是什么牌子?
中国古代经济结构是什么
摩尔质量为41克每摩尔的物质是什么
百盛电脑地址在什么地方,我要处理点事!
雪纺跟加厚雪纺做的汉服区别大吗?垂感会影响
博世燃气热水器7OOO出现扳手符号怎样外里
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?