为什么会有这个结果
Why is this result?
这是关于堆栈的吗?我认为最后一个*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
的,它将完全按照您所说的进行操作(但是它仍然不是未定义的,因为每个字符串文字都以零(