为什么会有这个结果

Why is this result?

本文关键字:结果 为什么      更新时间:2023-10-16

这是关于堆栈的吗?我认为最后一个*p++是不确定的。 *p++的意思是*(p++)还是*p;p++;

void test123()
{
    char s[] = "123", * p;
    p = s;
    // 1 2 3
    cout << *p++ << endl;
    cout << *p++ << endl;
    cout << *p++ << endl;
}
void test321()
{
    char s[] = "123", * p;
    p = s;
    //321
    cout << *p++ << *p++ << *p++ << endl;
}
int main(void)
{
    cout << "123:" << endl;
    test123();
    cout << "123:" << endl;
    test321();
    cout << "hello world" << endl;
    return 0;
}

我认为结果是不确定的。

根据

运算符优先级计算*p++*(p++)p++所做的是将p递增 1 并返回递增前的值

从 https://en.cppreference.com/w/cpp/language/operator_incdec

后递增和后递减创建对象的副本,递增或

递减对象的值,并返回递增或递减之前的副本。

即使在您提到的最后一行,p++ 也返回位置s+2因此取消引用它,我们会得到3,而不是它的下一个地址。

除了计算顺序(以test321为单位(之外,此代码中没有未定义的行为。

% 如果表达式是*++p的,它将完全按照您所说的进行操作(但是它仍然不是未定义的,因为每个字符串文字都以零((结尾(。

*p++的意思是*(p++)*p;p++,因为它们是相同的。

第一个++的优先级高于*,因此首先计算。然后发生取消引用。在这两种情况下。问题是p++返回增量之前的值,如C++标准中所述。

最后,正如评论中所说,在 C++17 中,改进了评估顺序,以便明确定义test321行为。在C++11中,情况确实并非如此

p指向的事实在 C++17 中也有很好的定义(它也会在 C++11 中指向相同的值,因为您有 4 个字符,而不仅仅是 3 个字符(。即使有额外的++,它仍然是明确定义的,除非你取消引用该值。但是仅仅指向数组的末尾也是很好的定义,这就是向量可以工作的原因。

相关文章: