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