运算符优先于cout和指针

时间:2018-05-28 06:14:49

标签: c++

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

#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

发生了什么?

3 个答案:

答案 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 语句的三个表达式。

  • 返回语句中的表达式。