首页 > 解决方案 > C++:来自 Stroustrup 示例的运算符优先级

问题描述

Stroustrup C++ 第 4 版第 197 页包含以下示例,这些示例导致打印的字符流递增,直到null和 not "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;
}

标签: c++

解决方案


是的,您对优先级和关联性的看法是正确的。这个表达式:

++*p;

被解析为

++(*p);

即首先间接p完成,然后返回的值递增。

这意味着在 while 循环中:

while (*p)
    cout << ++*p;

指针p实际上从未递增。这会导致一个无限循环,其中只有 的值p[0]永远递增。

这是一个演示,它将输出显示为一个很长的 ascii 值序列,从a. 注意abc打印

同理,表达式:

*++p;

被解析为:

*(++p);

这很好,因为指针首先递增,然后指针被取消引用。


推荐阅读