社区
C语言
帖子详情
定义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
打赏
收藏
定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是______
定义int a[]={1,2,3,4,5,6},*p=a;表达式(*++p)++的值是______
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
已知
int
a[]={1,2,3,4,5};
int
*p[]={a,a+1,a+2,a+3};
int
**q=p;
表达式
*(p[0]+1)+**(q+2)的
值
是____。
已知
int
a[]={1,2,3,4,5};
int
*p[]={a,a+1,a+2,a+3};
int
**q=p;
表达式
*(p[0]+1)+**(q+2)的
值
是____。 正确答案: A 你的答案: 空 (错误) 5 6 7 8 4 9 添加笔记 求解答(0) 收藏 纠错 in
*p
++
、*(p
++
)、
++
*p、
++
(*p)、(*p)
++
p存放的是a的地址,*p也等价于 a。但是在第四行,p指向的地址没有改变,但是*p的
值
发生了变化,这是由于(*p)等价于x[0](数组下标为0,位序是1),所以
表达式
(*p)
++
相当于是使数组第一项数据元素自增。
++
*p=2 和
++
(*p) 等价,两个
表达式
的
值
都等于 *p 的
值
+1(左
++
先自增后参与运算),指针p的
值
不变,p所指向的地址单元的
值
+1.*p
++
和 *(p
++
) 等价,两个
表达式
的
值
都等价于 *p的
值
,执行
表达式
之后,指针p的
值
增加一个地址单元长度,指向数组下一个位置;
对*p
++
与*
++
p;(*p)
++
与
++
(*p)的理解
参考:https://blog.csdn.net/baidu_37973494/article/details/82761455 *p
++
:等同于:*p; p += 1; 解析:由于*和
++
的运算优先级一样,且是右结合。故*p
++
相当于*(p
++
),p先与
++
结合,然后p
++
整体再与*结合。前面陈述是一种最常见的错误,很多初学者也是这么理解的。但是,因为
++
后置的时候,本身含...
2-1若变量已正确
定义
并且指针p已经指向某个变量x,则(*p)
++
相当于____。(1分)A.p
++
B.x
++
C.*(p
++
)D.&x
++
作者往年试卷单位
2-1 若变量已正确
定义
并且指针p已经指向某个变量x,则(*p)
++
相当于____。 (1分) A. p
++
B. x
++
C. *(p
++
) D. &x
++
作者 往年试卷 单位 浙江大学 2-2 下列语句
定义
px为指向
int
类型变量x的指针,正确的是( ) (1分) A.
int
x,*px=x; B.
int
x,*px=&x; C.
int
*px=&x,x; D.
int
x, px=x; 作者 zhangweina 单位 赤峰学院 2-3 执行下面程序段后,变
c语言
int
*p p=null,
int
* p=NULL 与 *p=NULL 区别
1.
int
*p=NULL 与*p=NULL的区别:1)
int
* p=NULL,
定义
一个指针,其指向的内存保存的是
int
型的数据,同时p的
值
为0X00000000(即完成一次初始化);其中,p是一个指针变量,p中内存地址处的内存是p指向的内存。所以,*前面的类型只是说明内存数据的类型,不管怎么样的指针类型,大小都是4bytes;2)
int
* p;→成为野指针*p =NULL;
定义
一个指针,指向内存...
C语言
70,005
社区成员
243,256
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章