对第二个代码片段的输出感到困惑。为什么输出与第一个程序不同?
#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 语句的三个表达式中的每一个。
返回语句中的表达式。