定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是______

zhuzhengzhou 2004-04-05 06:44:03
定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是______
...全文
7308 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuzhengzhou 2004-04-07
  • 打赏
  • 举报
回复 1
题目:定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是多少?

分析:
●int a[]={1,2,3,4,5,6},*p=a;
等价于
int a[]={1,2,3,4,5,6};
int *p;
p = a; /* 指向a的首地址,即 &(a[0]) */

●(*++p)++的值:
p是 &a[0]
++p后 p是 &a[1]
*++p 取值, a[1]的值是 2
(*++p)++ 就是 a[1]++
由于于++在右边,所以表达式的值是++之前的值: 2
但 a[1] 变成3

●最后:
a[]内容是 {1,3,3,4,5,6}
p 指向 a[1]
表达式的值是 2

所谓表达式(*++p)++的值,

x = (*++p)++; 后
x的值。

danielpan 2004-04-06
  • 打赏
  • 举报
回复
to zhuzhengzhou(特雷士)
danielpan(连) ,那谭老师错了吗?我不相信。

书上没错,你注意说的是执行了语句以后值才改变的,你现在是计算这个表达式的值,这个表达式的值是在语句执行完了之前算出来的,这时候值还没有改变.写个代码就很清楚了.
int a = 1;
printf("%d\n",a++);
printf("%d",a);
输出第一行是1,第二行是2.
也就是说,a++要在';'完了以后才真的把a加上1,第一句打印a++的时候';'还没有执行,a的值还没有加.
zhuzhengzhou 2004-04-06
  • 打赏
  • 举报
回复
To:danielpan(连)
对,现在我也是这样理解的,问题终于解决了。
zhuzhengzhou 2004-04-06
  • 打赏
  • 举报
回复
To moswawa(布娃娃)
你说的没有错,我的意思正是这样。
moswawa 2004-04-05
  • 打赏
  • 举报
回复
不是。。。
如果i=10,那么无论是使用还是不使用i,表达式i++的值和表达式++i的值是一样的,都是11
错了。
你刚好搞反了,其实i++和++i的区别就在于他们用于一个表达式赋值时。
比如
void main(void){
int a,i;
i = 10;
i++; /* 这儿写++i和i++都是一样的*/
printf("%d", i);/* i == 11*/
return;
}

void main(void){
int a,i;
i = 10;
a = i++; /* 这儿写++i和i++就不样的,些时a == 10,而如果是 a = ++i; a == 11*/
printf("%5d%5d", i, a);/* i == 11*/
return;
}
故应这样说才是对的:
如果i=10,那么无论是使用i++还是使用++i,i的值是一样的,都是11,

zhuzhengzhou 2004-04-05
  • 打赏
  • 举报
回复
谭老师的书P57,关于++、--的内容是这么说的:
“++i和i++的作用相当于i=i+1。但++i和i++不同之处在于++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。”

它也只说了执行而已,没有提到表达式。

但是根据谭老师上面这些话,我们可不可以这样理解:
如果i=10,那么无论是使用还是不使用i,表达式i++的值和表达式++i的值是一样的,都是11。本题中我们之所以输出的结果是2,是因为我们使用的是指针变量p,但是表达式的结果与你是否使用p无关,它仍然是照常运行,结果是3。
EvilOctal 2004-04-05
  • 打赏
  • 举报
回复
main(void)
{int a[]={1,2,3,4,5,6};
int *p=a,x;
x=(*++p)++;
return 0;
}

以上函数监视后你就可以发现x=2
但是如果不是赋值的话,整句执行完了后应该是3
本人菜鸟,希望高手赐教。
mikisky 2004-04-05
  • 打赏
  • 举报
回复
我上机试拉一下是2!
mikisky 2004-04-05
  • 打赏
  • 举报
回复
其实这种题目,出题人就没有问清楚,真的!
因为我们只要写一个程序实验一下就知道,谁对谁错!
关键是看你怎么去理解的问题拉!
zhuzhengzhou 2004-04-05
  • 打赏
  • 举报
回复
其实我是一直赞同moswawa的观点的,但是答案,对,就是答案.....答案说应该是3。
moswawa 2004-04-05
  • 打赏
  • 举报
回复
不,THQ没错,
即(a[0])++,如果a[0]=3,则(a[0])++的值为4
他的意思是说此时a[0]的值变成了4,但(a[0])++这个表达式的值还是3。
dragonQ 2004-04-05
  • 打赏
  • 举报
回复
答案是2
zhuzhengzhou 2004-04-05
  • 打赏
  • 举报
回复
danielpan(连) ,那谭老师错了吗?我不相信。
danielpan 2004-04-05
  • 打赏
  • 举报
回复
答案是2阿,++要在语句结束以后才+的
moswawa 2004-04-05
  • 打赏
  • 举报
回复
2
(*++p)++
首先: ++p, p 指向a[1] 即2;
所以些时(*++p) = 2
再(*++p)++,此时表达式为2,但得注意,这儿有几个副作用:
1。此时a[1]的值由2变成了3。(因为*++p)
2。此时p指向了a[2].....。(因为(*++p)++)
还有,只要你去仔细的看,就会发现在DEBUG状态和release状态下a[i]的值不一样?
为什么?
hackingtruth 2004-04-05
  • 打赏
  • 举报
回复
要搞清楚什么是变量的值, 什么是表达式的值.
(*++p)++
p先指向a, ++p指向a[1], (*++p)输出a[1]的值, 也就是2, (*++p)++, 括号后面的这个++在这个表达计算完成后, 把a[1]里的值加1, 所以在这个表达计算完成后a[1]就变成3了, 可以把它看成*(P+1)++, a[1]++.
zouxueping 2004-04-05
  • 打赏
  • 举报
回复
不好意思,没认真看就作答了,表达式的值应该是2,前面那位赋值的说法没错。
教材上可能没表达清楚。

jmlv 2004-04-05
  • 打赏
  • 举报
回复
我觉得这也要看一个extent的问题
你想得到它什么时期的值?
如果你把它付给一个变量,它当然是2
但之后表达式所指向的元素值就是3
这是我的理解,我也初学C++,望高手指教
^_^
zhuzhengzhou 2004-04-05
  • 打赏
  • 举报
回复
如果上面说的时针的,那么谭浩强老师的《C程序设计(第二版)》P215倒数第8 行有这样一段话:
(*p)++表示p所指向的值加一,即(a[0])++,如果a[0]=3,则(a[0])++的值为4。
这又该如何理解?
zhuzhengzhou 2004-04-05
  • 打赏
  • 举报
回复
谢谢 iicup(双杯献酒) ,按你的说法,表达式的值就是把这个表达式赋值给一个变量,输出这个变量的值就是表达式的值。这样理解可以吗?
加载更多回复(3)

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧