cout变量值延时

cout variable value delay

int * getInt2(int a[]) {
    (*a) *= 2;
    return a;
}

int main(int argc,char *argv[])
{
    int intInit = 1;
    int * (*intPtr)(int *) = getInt2;
    cout << intInit++ << ":" << intInit << endl;
    cout << intPtr(&intInit) << ":" << intInit<<endl;
    cout << intInit << endl;
    cout << *intPtr(&intInit) << endl;
    cout << (*intPtr)(&intInit) << ":" << *(*intPtr)(&intInit) << endl;
    cout << intInit << endl;
}

当运行时的真实结果:

1:2
012FFABC:2
4
8
012FFABC:16
32

但我希望它是:

1:2
012FFABC:4
4
8
012FFABC:32
32

我是不是误会了什么?是不是有什么延迟的原因?感谢任何线索。

我看到有人认为c++中的表达式行为未定义,焦点总是在自增操作上,所以我添加一个例子:

int addTarget(int &n) {
    n += 1;
    return n;
}
int multiplyTarget(int &n) {
    n *= 2;
    return n;
}

int main(int argc,char *argv[])
{
    int intTest = 1;
    cout << multiplyTarget(intTest) << ":" << addTarget(intTest) << endl;
    cout << addTarget(intTest) << ":" << multiplyTarget(intTest) << endl;
}

以上代码的结果是:

4:2
9:8

我看有人说输出顺序是从左到右,运算顺序是从右到me.this最能解释situation.but我觉得第一个例子的第一个输出应该是1:1不是1:2照这个theory.I好想知道理论

在 C++17 之前,

std::cout << intInit++ << ":" << intInit << endl;

intInit 的增量不必发生在下一个 <<

之前

所以两者

std::cout << intInit << ":" << intInit << endl; intInit++;

std::cout << intInit;
intInit++;
std::cout << ":" << intInit << endl; intInit++;

有效。

在 C++17 中,intInit++ 的全部副作用应该发生在 std::cout << ":" << intInit << endl 之前。

就像函数解析输入参数一样,从右到左计算,然后将值压入堆栈并显示value.for示例:

int add(int a, int b, int c)
{
    return a + b + c;
}
auto i = 0;
add(i++, i, ++i);

我们在last.but处得到5,如果先计算然后将值压入堆栈,我仍然认为第一个输入应该是1:1而不是1:2。但是当我将编译器标准更改为 c++ 17。上面代码的结果是 3.I 将原始代码更改为:

    int intInit = 1;
    int * (*intPtr)(int *) = getInt2;
    cout << intInit++ << ":" << intInit << endl;
    cout << *intPtr(&intInit) << ":" << intInit<<endl;
    cout << intInit << endl;
    cout << *intPtr(&intInit) << endl;
    //(* ptr)函数书写
    cout << *(*intPtr)(&intInit) << ":" << *(*intPtr)(&intInit) << endl;
    cout << intInit << endl;

并且输出正常:

1:2
4:4
4
8
16:32
32

确实和c++标准有关,c++ 14编译器可能不擅长参数解析。