【发布时间】:2020-06-07 18:20:14
【问题描述】:
Stroustrup C++ 第 4 版第 197 页包含以下示例,这些示例导致打印的字符流递增,直到 null 而不是 "abc"。问题:如何评估++*p? ++ 和 * 是相同的优先级和从右到左的评估,因此我的理解是 *p 首先评估,导致字符 p 指向,然后这个字符增加 ++。这种理解正确吗?谢谢
#include <iostream>
using namespace std;
void fp(char* p)
{
while (*p)
cout << ++*p;
}
void fr2(char& r)
{
char* p = &r;
while (*p)
cout << ++*p;
}
int main(int argc, char *argv[])
{
char s[] = "abc";
char *p = s;
fp(p);
fr2(*p);
return 0;
}
【问题讨论】:
-
这里不可能有歧义。请考虑使用
*p++。 -
谢谢 我知道应该使用
*p++来打印字符串。我只是通过 Stroustrup 的例子,这并没有出现在他的勘误表中 stroustrup.com/4th_printing3.html -
我会说“这是一个错误”。此外,这本书有点过时了,所以您可能应该寻找更现代的参考。
-
我的意思是
++*p被明确地解析为++(*p)而不考虑优先级和关联性。这些规则仅用于解决歧义。相比之下,*p++是模棱两可的,我们需要一些规则来解决歧义。 -
@Evg
*p++模棱两可?在现代解释中,++ 的优先级高于 *,因为 ++ 是后缀,因此在计算行之后执行操作。导致取消引用 p 用作表达式的值,然后递增指针。我相信 K&R*和++(后缀或前缀)具有相同的优先级,但 assoc 是从右到左的。它仍然会导致上述评估。
标签: c++