cout变量值延迟

时间:2019-04-17 11:38:44

标签: c++ pointers delay cout

lookup = db.index.str.startswith("34567890")
title = db.loc[lookup, "Title"]

运行时的真实结果:

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

我误解了什么?请问有什么原因导致延误?感谢您提供任何线索。

我看到有人认为表达式行为在c ++中是未定义的,并且焦点始终在自动递增操作中,所以我添加一个示例:

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

以上代码的结果为:

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;
}

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

我们最后得到5,但是如果先计算然后将值压入堆栈,我仍然认为第一个输入应该是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编译器可能不擅长参数解析。