对第二个代码段的输出感到困惑。为什么输出与第一个程序不同?
#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
我预计输出在下面的代码中是相同的:
#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
发生了什么?
答案 0 :(得分:5)
您的语句cout << "*p++ is " << *p++ << endl << ...;
被视为一个表达式,C ++几乎是按照评估表达式中使用的参数的顺序释放的。因此,未定义(实际上是行为),p++
和++
- 语句的评估顺序。
在第一种方法中,评估顺序取决于您指定的变量。在第二种情况下,C ++是免费的(如果表达式中没有序列点,则将其视为UB;在你的情况下,不存在序列点)。
答案 1 :(得分:0)
根据运算符优先级,运算符&lt;&lt;从左到右依次发生在cout对象中,并且依次对运算符&lt;&lt;&lt;&lt;&lt;没有具体说明。
答案 2 :(得分:0)
在连续的“序列点”之间,对象的值可以是 仅通过表达式修改一次。
https://msdn.microsoft.com/en-us/library/azk8zbxd.aspx
第二个代码段尝试在一个序列中多次修改指针的值。
C序列点列表:
logical-AND运算符(&amp;&amp;)的左操作数。
逻辑-OR运算符(||)的左操作数。
逗号运算符的左操作数(,)
函数调用运算符()
条件运算符的第一个操作数又名三元运算符(?:)
完整初始化表达式的结束(即表达式 这不是另一个表达的一部分,如结尾 在声明语句中初始化。)
表达式语句中的表达式。表达式陈述 由可选表达式后跟分号(; )组成。该 评估表达的副作用并且存在序列 在此评估之后。
在选择(if或switch)语句中控制表达式。
控制表达一段时间或执行语句。
for 语句的三个表达式。
返回语句中的表达式。