COUT 变量值延迟

cout variable value delay

本文关键字:延迟 变量值 COUT      更新时间:2023-10-16
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
我看到有人说输出序列是从左到右,

操作序列是从右到我,这可以解释大多数情况,但我认为根据这个理论,第一个示例的第一个输出应该是 1:1 而不是 1:2。我真的很想知道这个理论。

在 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之前。

就像函数解析输入参数,从右到左计算,然后将值推入堆栈并显示值。

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

但是如果先计算一下再把值推到栈里,我还是觉得第一个输入应该是1:1而不是1:2,但是当我把编译器标准改成c++17的时候。 上面代码的结果是 3.我将原始代码更改为:

    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 编译器可能不擅长参数解析。