注册 登录
编程论坛 C语言论坛

关于指针的一点疑惑 求解

hanserisgood 发布于 2022-08-29 20:33, 1145 次点击
《C primer plus》第六版第十章原文如下:
“total += *start++;
1)一元运算符*和++的优先级相同,但结合律是从右往左,所以start++先求值,然后才是*start。也就是说,指针start先递增后指向.
2)使用后缀形式(即start++而不是++start)意味着先把指针指向位置的值加到total上,然后再递增指针.
3)如果使用*++start,顺序反过来,先递增指针,在使用指针指向位置上的值.”
问题:
这里是不是自相矛盾了啊,我标了个123,1)和2)说的是一种情况吧?那为什么后面的解释不同反而1)和3)的解释相通?
如果书上写错了那实际上该是什么样的?结合律真的是从右往左算的么?
3 回复
#2
rjsp2022-08-30 09:16
这段解释是错误的,主要错误是把“优先级/结合律”与“求值顺序”强制关联,事实上两种是毫无关系的

根据“优先级/结合律”,应当将 *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编辑过]

#3
rjsp2022-08-30 09:19
结合律真的是从右往左算的么?
不同的操作符有不同的优先级和结合性
详见:https://zh.
#4
hanserisgood2022-09-09 15:59
谢谢了
1