带有 cout 和指针的运算符优先级



对第二个代码片段的输出感到困惑。为什么输出与第一个程序不同?

#include <iostream>
using namespace std;
int main() {
int s[5] = {1, 2 , 3, 4, 5};
int *p = s;
int first = *(p++);
int second = *++p;
int third = ++*p;
int fourth = *p++;
cout << "*p++ is " <<  first << endl
<< "*++p is " << second << endl
<< "++*p is " << third << endl
<< "*p++ is " << fourth << endl;
return 0;
}

输出:

*p++ is 1
*++p is 3
++*p is 4
*p++ is 4

https://ideone.com/Qu2uIJ

我希望输出在下面的代码中是相同的:

#include <iostream>
using namespace std;
int main() {
int s[5] = {1, 2 , 3, 4, 5};
int *p = s;
cout << "*p++ is " << *p++ << endl
<< "*++p is " << *++p << endl
<< "++*p is " << ++*p << endl
<< "*p++ is " << *p++ << endl;
return 0;
}

输出:

*p++ is 3
*++p is 3
++*p is 3
*p++ is 1

https://ideone.com/nwd7xR

这是怎么回事?

您的语句cout << "*p++ is " << *p++ << endl << ...;被视为一个表达式,并且C++在计算表达式中使用的参数的顺序上几乎是自由的。因此,它是未定义的(实际上是行为(,p++++语句的计算顺序。

在第一种方法中,计算顺序是根据您分配给的变量。在第二个中,C++ 是自由的(如果表达式中没有序列点,则将其视为 UB;在您的表达式中,没有序列点(。

根据运算符优先级,运算符<<是从左到右的,它依次出现在 cout 对象中,并且未指定运算符 <<参数的计算顺序。

在连续的"序列点"之间,对象的值可以是 表达式仅修改一次。

https://msdn.microsoft.com/en-us/library/azk8zbxd.aspx

第二个代码段尝试在一个序列中多次修改指针的值。

C 序列点列表:

  • 逻辑 AND 运算符 (&&(的左操作数。

  • 逻辑 OR 运算符 (||(的左操作数。

  • 逗号运算符 (,(的左操作数

  • 函数调用运算符((

  • 条件运算符的第一个操作数又名三元运算符(? :(

  • 完整初始化表达式(即表达式(的结尾 不是另一个表达式的一部分,例如 声明语句中的初始化(。

  • 表达式
  • 语句中的表达式。表达式语句 由一个可选表达式后跟一个分号 (;( 组成。这 评估表达的副作用,并有一个序列 此评估之后的点。

  • 选择(if 或开关(语句中的控制表达式

  • while 或 do 语句的控制表达式

  • for 语句的三个表达式中的每一个。

  • 返回语句中的表达式。

最新更新