标题:关于指针的一点疑惑 求解
只看楼主
hanserisgood
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2022-8-16
结帖率:77.78%
已结贴  问题点数:20 回复次数:3 
关于指针的一点疑惑 求解
《C primer plus》第六版第十章原文如下:
“total += *start++;
1)一元运算符*和++的优先级相同,但结合律是从右往左,所以start++先求值,然后才是*start。也就是说,指针start先递增后指向.
2)使用后缀形式(即start++而不是++start)意味着先把指针指向位置的值加到total上,然后再递增指针.
3)如果使用*++start,顺序反过来,先递增指针,在使用指针指向位置上的值.”
问题:
这里是不是自相矛盾了啊,我标了个123,1)和2)说的是一种情况吧?那为什么后面的解释不同反而1)和3)的解释相通?
如果书上写错了那实际上该是什么样的?结合律真的是从右往左算的么?
搜索更多相关主题的帖子: start 指针 结合 指向 递增 
2022-08-29 20:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
这段解释是错误的,主要错误是把“优先级/结合律”与“求值顺序”强制关联,事实上两种是毫无关系的

根据“优先级/结合律”,应当将 *start++ 看成是 *(start++),而不能看成 (*start)++。
“优先级/结合律”的作用就仅仅这么多,不能瞎想认为 *(start++) 中 start先递增或后递增,只能说 start++ 先评估。评估 start++ 时,可以但未必 需要先递增或后递增start。

其实,C语言标准描述得非常简单清晰:start++ 这个表达式的评估值是start原先的值,“副作用是”start自增1。
所以 total += *start++ 可能是:
    _tmp = start;
    ++start;
    total += *_tmp;
也可能是:
    toatl += *start;
    ++start;
也可能是
    ……

[此贴子已经被作者于2022-8-30 09:28编辑过]

2022-08-30 09:16
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
结合律真的是从右往左算的么?
不同的操作符有不同的优先级和结合性
详见:https://zh.
2022-08-30 09:19
hanserisgood
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2022-8-16
得分:0 
谢谢了
2022-09-09 15:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509909-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069432 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved