C++ 中的"sequenced before"和"Every evaluation in the calling function"
"sequenced before" and "Every evaluation in the calling function" in c++
调用函数(包括其他函数调用(中在被调用函数体执行之前或之后没有特别排序的每个求值,都是相对于被调用函数的执行不确定排序的。
换言之,函数执行并不相互交错。
"每次评估"的含义是什么。
#include <iostream>
using namespace std;
int a = 0;
ing b = 0;
int f(int,int)
{
cout << "call f, ";
cout << "a=" << a << ", ";
cout << "b=" << b << ", ";
return 1;
}
int g()
{
cout << "call g, ";
cout << "a=" << a << ", ";
cout << "b=" << b << ", ";
return 1;
}
int main()
{
f(a++, b++) + g();
return 0;
}
它表示函数调用表达式
f(a++, b++)
的求值,因此a++的求值、b++的求值和f的执行都是在g执行之前或之后排序的。在这种情况下,有两种结果。如果在执行g:之前对表达式f(a++,b++(的评估进行测序:
call f, a=1, b=1, call g, a=1, b=1,
如果g的执行是在表达式f(a++,b++(求值之前排序的:
call g, a=0, b=0, call f, a=1, b=1,
2.它意味着评估a++、评估b++或执行f。
因此,a++的评估可以在g的执行之前排序,b++的评估和f的执行可以在g执行之后排序。
call g, a=1, b=0, call f, a=1, b=1,
- 它意味着价值计算或副作用
因此,a++的值计算可以在执行g之前排序,a++副作用、b++的评估和f的执行可以在执行g.之后排序
call g, a=0, b=0, call f, a=1, b=1,
在这种情况下,
f(a++, b++) + (a = g());
1.value computation of a++
2.execution of g
3.side effect of a++
4.side effect of = (a = 0)
5.evaluation of b++
6.execution of f
call g, a=0, b=0, call f, a=0, b=1,
哪一个是对的?或者其他答案?
我不会说英语,英语也不太好。
我希望你能理解我说的
f(h1((,h2((+g(h3((、h4(((
h1和h2在f之前测序,h3和h4在g之前测序。
有可能吗:
h1
h4
h2
f
h3
g
[expr.post.incr]/1…
++
表达式的值计算在修改操作对象之前进行排序。对于不确定序列的函数调用,后缀的操作CCD_ 5是一个单独的评价。[注意:因此,函数调用不应介入左值到右值的转换和与任何单个后缀++
运算符相关的副作用之间。--结束注释]。。。
我对此的理解是,a++
和b++
的副作用必须在执行f
的主体之前完成,因此在f
中必须是a==1
和b==1
。您的示例#2和#3不可能采用一致的实施方式。
对g
的调用与对f
的调用不确定地排序,因此可以观察到增量前或增量后的值。
f(a++, b++) + g();
编译器可以决定上面语句中f()
和g()
的执行顺序。
这只是两种可能性,而不是三种。
f()
将首先调用并修改变量a
和b
或g()
将首先得到呼叫。
- 为什么'allocate in one library and free in the other'是错误的
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- 错误:在 MacOS 上"no member named 'uint8_t' in the global namespace"
- "The ordinal 344 could not be located in the dynamic link library"
- 如何从类调用函数 - 错误"was not in the scope"
- "the procedure entry point _ZNSt8_detail15_List_node_base7_M_hookEPS0_ could not be located in the
- 如何修复理性狂想曲错误:"Current value is " VC11 ", but no Visual Studio installation was not found in the direc
- Qt控制台应用程序"WARNING: QApplication was not created in the main() thread"
- 在win2k3上运行.exe时发生"The procedure entry point GetErrorMode could not be located in the dynamic link l
- 我正在开发Arduino Uno。错误:开关外壳的"'RX' not declared in the scope."和"duplicate case value"
- 告诉海湾合作委员会"I want to use SSE4.1, but ONLY in the places I want!"
- COM in the non-Windows world?
- 禁止从模板类的库标头中"Base class ‘class X’ should be explicitly initialized in the copy constructor"
- "virtual base class in the case of multilevel inheritance"有意义吗
- C++ in the cloud. Casablanca REST Service on Microsoft Azure
- 名称查找是否应该"in the class of the object expression"查找该类的成员?
- C++ "Count the number of collisions at each slot in the hash table"
- 如何从我的 C++ 应用程序设置默认主页"in the browser"?
- (更新)QT QML 5.6 - 什么原因导致此警告"QApplication was not created in the main() thread"?
- C++标准措辞:"through all iterators in the range"是否意味着顺序?