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对这个理论。我真的很想知道这个理论。
答案 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编译器可能不擅长参数解析。