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
我看到有人说输出序列是从左到右,操作序列是从右到我,这可以解释大多数情况,但我认为根据这个理论,第一个示例的第一个输出应该是 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 编译器可能不擅长参数解析。
相关文章:
- 使用变量值作为 PlaySound 中的路径
- 通过指针偏移量访问结构变量值
- 变量值在 C++ 中的 glutIdleFunc() 中未递增
- 更新 #ifdef 中的现有变量值?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 通过 Rcpp 和 bit64 R 包将最大的int64_t变量值从 C++ 传递到 R
- 如何使用 IRBuilder 更新 LLVM IR 中的全局变量值?
- 更改已在运行的程序的变量值
- 在 Xcode 中使用后对外部变量值进行初始化
- C++整数变量值
- 变量值,在三元运算符之后
- 如何获得对不同类的引用,以便从所述类内部获得变量值
- Java应用程序的JNI-c++变量值
- 如何固定从传感器获得的变量值
- 离开方法时重置变量值
- 打印具有通用特定变量值的类对象
- 在宏函数C++中设置宏变量值
- 为什么每次迭代都会获得相同的变量值? C++
- 如何根据基类对象中的变量值分配派生类中的变量?
- COUT 变量值延迟