为什么程序结果是这个?请解释一下

#include <iostream>
using namespace std;
struct Data
{ int n ;
double score ;
} ;
int main()
{ Data a[3] = { 1001,87,1002,72,1003,90 } , *p = a ;
cout << (p++)->n<< endl ;
cout << (p++)->n<< endl ;
cout << p->n++ <<endl ;
cout << (*p).n++ <<endl ;
}

1001
1002
1003
1004

这题主要考点是对运算优先级以及地址运用
我们先来看看cout输出前,初始化之后的情况如下:
a的地址:0x0018ff14
a[0] 内容
n 1001
score 87.000000000000
a[1] 内容
n 1002
score 72.000000000000
a[2] 内容
n 1003
score 90.000000000000

p的地址0x0018ff14
n 1001
score 87.000000000000

*p内容
n 1001
score 87.000000000000

可能有很多同学不理解结构体里面是怎么存储的呢?
从上面内容可以看到,在内存地址0x0018ff14 这个区域,存储着结构体 a
可在定义的时候,a[3]就是个数组,数组是个连续的存储空间,所以数组内容的
a[0] a[1] a[2] 存储是连续的,具体占多少字节我就不细说了,
a[0]又分为一个int,一个double,所以数组在内存的排列是int double int double int double

而定义*p = a ; 这句话是在a定义的同一行,用逗号分隔,所以可以看成
Data *p = a ;
*p是什么,我们可以简单的看成是一个以p开头,无限大的数组,这样看就简单多了,
p[0] 就是 a[0] p[1] 就是 a[1] p[2] 就是 a[2] 而p[3]没有值,后面都是空的
*p就是无限个int double连在一起,只是运行前没有分配好固定空间

再看看cout语句,
cout << (p++)->n<< endl ;
到底是先执行p++呢,还是cout呢?具体我先不讨论,一会从结果里总结

p在cout执行前对应的是a[0] 那么输出的就是 a[0].n,就是1001
第一句执行后,进行p++操作,这时候P已经变成了1

第二次执行cout << (p++)->n<< endl ;时候,先输出p[1]的n值就是a[1].n即1002
进行p++操作,这时候,p已经为2了

第三次执行cout << p->n++ <<endl ;p[2]对应的是a[2] 其中a[2].n为1003
所以先输出1003,然后对n进行++处理,由于地址没变,所以这时候是内容边了,
这时候 p[2]->n 和 a[2].n 结果都是1004

第四次执行cout << (*p).n++ <<endl ;不管里头内容多么复杂的做自增运算
都是想输出后运算,所以输出1004,然后进行(*p).n++
运算后n变成了1005
(其实p->n 和 (*p).n 这俩只是写法的不同,东西是一样的)

从这题可以看出,自增运算的优先级要比输出cout低,就是想输出,后执行
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-08
后缀++是返回当前值,值才加1;而前缀++,是加1,再返回值。本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网